仅出于记录目的,我开始使用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提供了答案。

08-19 12:43