为 UITableView 使用 RxCocoa 扩展时,如何控制 canEditRowAtIndexPath
How can I take control of canEditRowAtIndexPath when using RxCocoa extension for UITableView
在开始我的问题之前,我使用的是 Swift 2 和 xcode 7 beta。
所以我使用 RxSwift 和 RxCocoa 将我的 ViewModel 绑定到 TableView。在我的 UITableViewController
viewDidLoad
中,我正在做这个绑定...
someCollectionOfViewModels
.bindTo(self.tableView.rx_itemsWithCellIdentifier("SomeCell")) {
(_, viewModel, cell: SomeTableViewCell) in
cell.tripViewModel = viewModel
}
someCollectionOfViewModels
只是包裹在 Variable<>
中的视图模型数组,所以 Variable<[SomeViewModel]>.cell.tripViewModel
是 SomeViewModel
.
类型
None 确实与问题相关,一切都很好,当我的视图模型更新时,我的 table 也会更新。问题是我希望我的 table 单元格是非 editable 并且 RxCocoa 为上述绑定设置的 UITableViewDataSource
没有实现可选的 canEditRowAtIndexPath
此协议上的方法,它默认为 true 使单元格 editable。我知道我可以实现自己的 RxTableViewDataSourceType
,这相当简单,但需要大量代码才能让这件小事发挥作用。我对 RxSwift 和 iOS 都很陌生,我是不是漏掉了一些简单的东西?在上面的闭包中,我可以访问 UITableCellView
以在单元格本身上设置一些 属性 以使其成为非 editable 吗?我缺少的 RxCocoa 扩展中的一些东西怎么样。如果必须的话,我会去写我自己的 RxTableViewDataSource
,但我想我会先在这里问一下。
谢谢,
-比尔
我 posted 在 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 提供答案。
在开始我的问题之前,我使用的是 Swift 2 和 xcode 7 beta。
所以我使用 RxSwift 和 RxCocoa 将我的 ViewModel 绑定到 TableView。在我的 UITableViewController
viewDidLoad
中,我正在做这个绑定...
someCollectionOfViewModels
.bindTo(self.tableView.rx_itemsWithCellIdentifier("SomeCell")) {
(_, viewModel, cell: SomeTableViewCell) in
cell.tripViewModel = viewModel
}
someCollectionOfViewModels
只是包裹在 Variable<>
中的视图模型数组,所以 Variable<[SomeViewModel]>.cell.tripViewModel
是 SomeViewModel
.
None 确实与问题相关,一切都很好,当我的视图模型更新时,我的 table 也会更新。问题是我希望我的 table 单元格是非 editable 并且 RxCocoa 为上述绑定设置的 UITableViewDataSource
没有实现可选的 canEditRowAtIndexPath
此协议上的方法,它默认为 true 使单元格 editable。我知道我可以实现自己的 RxTableViewDataSourceType
,这相当简单,但需要大量代码才能让这件小事发挥作用。我对 RxSwift 和 iOS 都很陌生,我是不是漏掉了一些简单的东西?在上面的闭包中,我可以访问 UITableCellView
以在单元格本身上设置一些 属性 以使其成为非 editable 吗?我缺少的 RxCocoa 扩展中的一些东西怎么样。如果必须的话,我会去写我自己的 RxTableViewDataSource
,但我想我会先在这里问一下。
谢谢,
-比尔
我 posted 在 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 提供答案。