2016-01-26 10 views
6

Ich lernte example in der Demo, um ein UITableView zu erstellen und Zellen zu rendern.Wie soll ich UITableViewCell mit RxSwift aktualisieren?

Meiner Meinung nach items ist ViewModel, möchte ich einige Daten über das Netzwerk mit Alamofire oder anderen Bibliothek anfordern. Wenn ich die Antwort bekomme, wie kann ich den Text der Zelle aktualisieren?

Mit anderen Worten, ich möchte ViewModel an Zellen binden. Wenn sich die Daten des Modells änderten, konnte der Inhalt der Zelle automatisch geändert werden.

Ich habe eine Idee ist: eine Observable Sequenz für den Inhalt (binden an Zell) der Zelle erstellen .Wenn die Serverantwortdaten nennen, Funktion tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top). Aber das scheint keine Gnade oder gute Methode zu sein.

So, hoffe, einige kann mir helfen :)

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) 

Antwort

-1

Änderung Variable und Änderungswert

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

Hallo, Artem Kislitsyn, Thaks für Ihre Antwort. In meinem Projekt möchte ich Zelle Inhalt auf Antrag vom Netz im backgroud aktualisieren. Wenn die Serverantwort die Zelle den Inhalt automatisch aktualisieren konnte ... – Bronts

+0

Im Beispielprojekt RXExample WikipediaImageSearch Modul zeigen, wie Sie Anfrage im Hintergrund oder GitHubSearchRepositories tun können –

4

Ihre client (Alomofire, ...) werden einige wie dieses:

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

In der viewModel haben Sie die items Eigenschaft:

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

Und dann, in der 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

können Sie diese versuchen

//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 
Verwandte Themen