2016-01-26 3 views
6

Я узнал example в демо, чтобы создать UITableView и отобразить ячейки.Как мне сделать, чтобы обновить UITableViewCell с помощью RxSwift?

На мой взгляд, items is viewModel, я хочу запросить некоторые данные по сети, используя Alamofire или другую библиотеку. Когда я получу ответ, как я могу обновить текст ячейки?

Другими словами, я хочу привязать viewModel к ячейкам. Когда данные модели будут изменены, содержимое ячейки может автоматически изменяться.

У меня есть идея: создать наблюдаемую последовательность для содержимого ячейки (привязать к ячейке). Когда данные ответа сервера, он вызывает функцию 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

Привет, Артем Кислицын, Thaks за ваш ответ. В моем проекте я хочу обновить содержимое ячейки по запросу из сети в backgroud. Когда ответ сервера, ячейка может обновить содержимое автоматически ... – 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 
Смежные вопросы