2015-09-25 5 views
6

Nur für den Datensatz, bevor ich in meine Frage starten, verwende ich Swift 2 und xcode 7 Beta.Wie kann ich die Kontrolle über canEditRowAtIndexPath bei der Verwendung von RxCocoa Erweiterung für UITableView

Also verwende ich RxSwift und RxCocoa, um mein ViewModel an das TableView zu binden. In meinem UITableViewController viewDidLoad ich diese Bindung ... tue

someCollectionOfViewModels 
    .bindTo(self.tableView.rx_itemsWithCellIdentifier("SomeCell")) { 
     (_, viewModel, cell: SomeTableViewCell) in 
      cell.tripViewModel = viewModel 
    } 

someCollectionOfViewModels ist nur ein Array von Ansichtsmodelle in einer Variable < gewickelt>, so Variable < [SomeViewModel]>. cell.tripViewModel ist vom Typ SomeViewModel.

Nichts davon ist wirklich relevant für das Problem, es funktioniert alles gut und wenn mein Ansichtsmodell aktualisiert, meine Tabelle aktualisiert. Das Problem ist, dass ich möchte, dass meine Tabellenzellen nicht editierbar sind und dass die UITableViewDataSource, die RxCocoa für die obige Bindung einfügt, nicht die optionale canEditRowAtIndexPath-Methode für dieses Protokoll implementiert und sie standardmäßig auf "true" setzt und die Zellen editierbar macht. Ich weiß, dass ich meine eigene RxTableViewDataSourceType implementieren kann, und das ist ziemlich einfach, aber eine Menge Code, nur um diese eine kleine Sache zu funktionieren. Ich bin sowohl mit RxSwift als auch mit iOS ziemlich neu, vermisse ich etwas Einfaches? Gibt es einen Weg in der obigen Schließung, wo ich Zugriff auf die UITableCellView habe, um eine Eigenschaft auf der Zelle selbst zu setzen, damit sie nicht editierbar ist? Wie wäre es mit etwas in den RxCocoa Erweiterungen, die ich vermisse? Wenn ich muss, werde ich gehen und meine eigene RxTableViewDataSource schreiben, aber ich dachte, ich würde hier zuerst fragen.

Danke,

-Bill

+0

Haben Sie eine Lösung gefunden? – Noxt

Antwort

4

ich posted diese gleiche Frage über im Github-Projekt und erhielt die Antwort. Der Schlüssel ist, zu rx_setDelegate(self) und implementieren UITableViewDelegate wie so:

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 
} 
} 

Dank Krunoslav Zaher im RxSwift Projekt für die Antwort bereitstellt.

Verwandte Themen