为 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.tripViewModelSomeViewModel.

类型

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 提供答案。