2016-01-26 11 views
6

W wersji demo nauczyłem się example, aby utworzyć UITableView i renderować komórki.Jak powinienem dokonać aktualizacji UITableViewCell za pomocą RxSwift?

Moim zdaniem, items to viewModel, chcę zażądać pewnych danych w sieci przy użyciu Alamofire lub innej biblioteki. Kiedy otrzymam odpowiedź, Jak mogę zaktualizować tekst komórki?

Innymi słowy, chcę powiązać viewModel z komórkami. Gdy dane modelu uległy zmianie, zawartość komórki mogła się zmienić automatycznie.

Mam pomysł: utworzyć obserwowalną sekwencję zawartości komórki (powiązanie z komórką). Kiedy dane odpowiedzi serwera, wywołują funkcję tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top). Ale to nie jest łaska ani dobra metoda.

Więc nadzieja niektóre mogą mi pomóc :)

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)" 
      /* to do some binding or something else ? */ 
     } 
     .addDisposableTo(disposeBag) 


    tableView 
     .rx_modelSelected(String) 
     .subscribeNext { value in 
      DefaultWireframe.presentAlert("Tapped `\(value)`") 
     } 
     .addDisposableTo(disposeBag) 

Odpowiedz

-1

zmiana wartości zmiennej i zmian

let items = Variable([ 
     "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)" 
     /* to do some binding or something else ? */ 
    } 
    .addDisposableTo(disposeBag) 


tableView 
    .rx_modelSelected(String) 
    .subscribeNext { value in 
     DefaultWireframe.presentAlert("Tapped `\(value)`") 
     items.value = ["item 1", "item 2"] //your updated array 
    } 
    .addDisposableTo(disposeBag) 
+0

Cześć, Artem Kislitsyn, Thaks za odpowiedź. W moim projekcie chcę zaktualizować zawartość komórki na żądanie z sieci w tle. Kiedy odpowiedź serwera, komórka może zaktualizować zawartość automatycznie ... – Bronts

+0

W przykładowym projekcie RXExample WikipediaImageSearch moduł pokazuje, jak można wykonać żądanie w tle lub GitHubSearchRepositories –

4

Twój client (Alomofire, ...) będzie miał pewne tak:

func searchSomething() -> Observable<[YourModel]> 

W viewModel otrzymasz własność items:

private(set) lazy var items : Observable<[YourModel]> = 
    self.client.searchSomething() 
     .observeOn(MainScheduler.instance) 
     .shareReplay(1) 

A potem, w viewController:

tableView.dataSource = nil 

// Bind the items to the table view data source 
viewModel.items 
    .bindTo(tableView.rx.items) { tableView, index, item in 
     let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell") 
     cell.textLabel?.text = item.title // if item.title is a String 

      return cell 
    } 
    .addDisposableTo(disposeBag) 
0

można spróbować to

//important! 
var items = Variable([YourModel]()) //empty now 

let cellIdentifier = NSStringFromClass(YourCell.self).components(separatedBy: ".")[1] 

tableView.register(YourCell.classForCoder(), forCellReuseIdentifier: cellIdentifier) 

_ = tableView.rx.setDelegate(self) 

items.asObservable().bindTo(tableView.rx.items(cellIdentifier: cellIdentifier, cellType: YourCell.self)){ 
      (index,model,cell) in 
      cell.detailTextLabel?.text = model.age 
      }.addDisposableTo(dispose) 
//just like your network request  
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 
      self.items.value = [1,3,4,5,6,7,8] //has value now 
} 
//it works fine for me 
Powiązane problemy