仅出于记录目的,我开始使用Swift 2和xcode 7 beta。
所以我正在使用RxSwift和RxCocoa将ViewModel绑定(bind)到TableView。在我的UITableViewController
viewDidLoad
中,我正在执行此绑定(bind)...
someCollectionOfViewModels
.bindTo(self.tableView.rx_itemsWithCellIdentifier("SomeCell")) {
(_, viewModel, cell: SomeTableViewCell) in
cell.tripViewModel = viewModel
}
someCollectionOfViewModels
只是包装在Variable<>
中的 View 模型的数组,因此Variable<[SomeViewModel]>.cell.tripViewModel
的类型为SomeViewModel
。这些都不是真正与问题有关的东西,它们都很好用,当我的 View 模型更新时,我的表也更新了。问题是我希望我的表格单元格不可编辑,并且RxCocoa为上述绑定(bind)而放置的
UITableViewDataSource
不在此协议(protocol)上实现可选的canEditRowAtIndexPath
方法,并且默认为true,从而使这些单元格可编辑。我知道我可以实现自己的RxTableViewDataSourceType
,这很简单,但是很多代码只是为了使这一小功能起作用。我对RxSwift和iOS都相当陌生,我是否缺少简单的东西?在上面的闭包中,有没有一种方法可以访问UITableCellView
来设置单元格本身的某些属性以使其不可编辑?我缺少的RxCocoa扩展中的内容如何?如果需要的话,我会继续写自己的RxTableViewDataSource
,但是我想我会先在这里问一下。谢谢,
-法案
最佳答案
我在Github项目中也回答了同样的问题,并收到了答案。关键是rx_setDelegate(self)
并实现UITableViewDelegate
,如下所示:
class SimpleTableViewExampleViewController : ViewController, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let items = Observable.just([
"First Item",
"Second Item",
"Third Item"
])
items
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
}
.addDisposableTo(disposeBag)
tableView
.rx_modelSelected(String)
.subscribeNext { value in
DefaultWireframe.presentAlert("Tapped `\(value)`")
}
.addDisposableTo(disposeBag)
tableView.rx_setDelegate(self)
.addDisposableTo(disposeBag)
}
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath: NSIndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.None
}
}
感谢RxSwift项目中的Krunoslav Zaher提供了答案。