2015-09-25 13 views
6

Solo per il record prima di lanciarmi nella mia domanda sto usando Swift 2 e xcode 7 beta.Come posso prendere il controllo di canEditRowAtIndexPath quando si utilizza l'estensione RxCocoa per UITableView

Quindi sto usando RxSwift e RxCocoa per associare il mio ViewModel al TableView. Nel mio UITableViewController viewDidLoad sto facendo questo legame ...

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

someCollectionOfViewModels è solo una serie di modelli di vista avvolte in una variabile <>, in modo variabile < [SomeViewModel]>. cell.tripViewModel è di tipo SomeViewModel.

Nessuno di questi è veramente pertinente al problema, tutto funziona alla grande e quando il mio modello di vista si aggiorna, la mia tabella si aggiorna. Il problema è che voglio che le mie celle di tabella non siano modificabili e UITableViewDataSource che RxCocoa mette in atto per il suddetto binding non implementa il metodo canEditRowAtIndexPath opzionale su questo protocollo e ha come valore predefinito true rendendo le celle modificabili. So di poter implementare il mio RxTableViewDataSourceType e questo è abbastanza semplice ma un sacco di codice solo per far funzionare questa piccola cosa. Sono abbastanza nuovo sia per RxSwift che per iOS, mi manca qualcosa di semplice? C'è un modo nella chiusura sopra dove ho accesso a UITableCellView per impostare alcune proprietà sulla cella stessa per renderla non modificabile? Che ne dici di qualcosa nelle estensioni RxCocoa che mi manca. Se dovessi, andrò a scrivere la mia RxTableViewDataSource, ma ho pensato di chiederlo prima.

Grazie,

-Bill

+0

Hai trovato una soluzione? – Noxt

risposta

4

ho posted questa stessa domanda più nel progetto Github e ha ricevuto la risposta. La chiave è di rx_setDelegate(self) e implementare UITableViewDelegate in questo modo:

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

Grazie a Krunoslav Zaher nel progetto RxSwift per fornire la risposta.

Problemi correlati