2016-01-26 87 views
6

我在演示中學到了example來創建一個UITableView並渲染單元格。我應該如何通過使用RxSwift來更新UITableViewCell?

在我看來,items是viewModel,我想通過使用Alamofire或其他庫來請求跨網絡的一些數據。當我收到回覆時,如何更新單元格的相關文本?

換句話說,我想將viewModel綁定到單元格。當模型數據改變時,單元格的內容可能會自動改變。

我有一個想法是:爲單元格的內容創建一個Observable序列(綁定到單元格)。當服務器響應數據時,它調用函數tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)。但這似乎不是一種優雅或好方法。

所以,希望有能幫助我:)

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) 

回答

-1

變化變量和變化值

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

嗨,阿爾喬姆Kislitsyn,Thaks你的答案。在我的項目中,我想通過背景中的網絡請求更新單元格的內容。當服務器響應單元格時可以自動更新內容... – Bronts

+0

示例項目RXExample WikipediaImageSearch模塊顯示如何在後臺或GitHubSearchRepositories中執行請求 –

4

client(Alomofire,......)都會有一些這樣的:

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

viewModel你將有items財產:

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

,然後在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

你可以試試這個

//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 
相關問題