[使用UITableView的RxCocoa扩展名时如何控制canEditRowAtIndexPath

问题描述 投票:6回答:1

为了记录,我开始使用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

这些都不是真正与问题有关的东西,它们都很好用,当我的视图模型更新时,我的表也更新了。问题是我希望表格单元格不可编辑,并且RxCocoa为上述绑定放置的UITableViewDataSource在此协议上未实现可选的canEditRowAtIndexPath方法,并且默认为true,从而使单元格可编辑。我知道我可以实现自己的RxTableViewDataSourceType,这很简单,但是有很多代码可以使这件事起作用。我对RxSwift和iOS都相当陌生,我是否缺少简单的东西?在上面的闭包中,有没有办法我可以访问UITableCellView来设置单元格本身的某些属性以使其不可编辑?我缺少的RxCocoa扩展中的内容如何?如果需要的话,我会去写我自己的RxTableViewDataSource,但我想我想先问一下。

谢谢,

-比尔

ios swift uitableview reactive-programming rx-swift
1个回答
4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.