2015-09-25 18 views
6

Tylko dla zapisu przed uruchomieniem mojego pytania używam wersji beta Swift 2 i xcode 7.Jak mogę przejąć kontrolę nad canEditRowAtIndexPath, gdy używam rozszerzenia RxCocoa dla UITableView

Używam RxSwift i RxCocoa do wiązania mojego ViewModel z TableView. W moim UITableViewController viewDidLoad robie to wiązanie ...

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

someCollectionOfViewModels jest tylko tablicą widok modeli zawinięte w zmiennej <>, więc zmienna < [SomeViewModel]>. cell.tripViewModel jest typu SomeViewModel.

Nic z tego nie jest naprawdę związane z problemem, wszystko działa świetnie i kiedy mój model widoku jest aktualizowany, moja tabela aktualizuje się. Problem polega na tym, że chcę, aby moje komórki tabeli nie były edytowalne, a zasób UITableViewDataSource, który RxCocoa wstawia dla powyższego wiązania, nie implementuje opcjonalnej metody canEditRowAtIndexPath w tym protokole i domyślnie jest ustawiony na true, umożliwiając edycję komórek. Wiem, że mogę zaimplementować mój własny RxTableViewDataSourceType i to jest dość proste, ale dużo kodu, aby uzyskać tę jedną małą rzecz do pracy. Jestem całkiem nowy zarówno dla RxSwift, jak i iOS, czy brakuje mi czegoś prostego? Czy jest jakiś sposób w powyższym zamknięciu, w którym mam dostęp do UITableCellView, aby ustawić niektóre właściwości w samej komórce, aby uniemożliwić jej edycję? Co powiesz na coś w rozszerzeniach RxCocoa, których mi brakuje. Jeśli będę musiał, odejdę i napiszę własny RxTableViewDataSource, ale pomyślałem, że najpierw zapytam.

Dzięki,

-Bill

+0

Znalazłeś rozwiązanie? – Noxt

Odpowiedz

4

I posted to samo pytanie w projekcie GitHub i otrzymał odpowiedź. Kluczem do sukcesu jest rx_setDelegate(self) i wdrożenie UITableViewDelegate tak:

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

Dzięki Krunoslav zaher w projekcie RxSwift do jej udzielenia.