[英]How should I do to update UITableViewCell by using RxSwift?
我了解到例如在演示中創建一個UITableView和渲染單元。
我認為items
是viewModel,我想使用Alamofire或其他庫在網絡上請求一些數據。 收到回復后,如何更新與單元格相關的文本?
換句話說,我想將viewModel綁定到Cells。 當模型的數據更改時,單元格的內容可能會自動更改。
我有一個想法:為單元格的內容創建一個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)
您的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)
你可以試試這個
//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
更改為變量並更改值
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.