2017-02-11 2 views
1

Я вижу, что я могу использовать Subject, например Publish или Variable, чтобы добавить новый элемент в представление таблицы или коллекции, и это будет правильно отображаться в конце, но что, если нужно добавить новое данных в начале представления таблицы. что делать тогда ??Как добавить данные в tableview или collectionview с помощью RxSwift

Как я могу добавить данные к наблюдаемой последовательности, чтобы новые данные отображались в верхней части таблицы или вида коллекции?

ответ

2

Вы можете использовать оператор combineLatest.

Первоначально newData является пустой массив, а при добавлении в него данные, он отображается в верхней части tableView

let data = [ 
     "A New Hope", 
     "The Empire Strikes Back", 
     "Return of the Jedi" 
    ] 

    let obsData = Observable.just(data) 

    let newData = [ 
     "The Phantom Menace", 
     "Attack of the Clones", 
     "Revenge of the Sith" 
    ] 
    let obsNewData = Observable.just(newData) 

    let items = Observable.combineLatest(obsData, obsNewData){ 
     $1+$0 
    }  

    items.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, film, cell) in 
     cell.textLabel?.text = film 
    } 
    .addDisposableTo(disposeBag) 
+0

как это добавляет данные? – LynAs

+0

С 'merge'оператором. Проверьте новый ответ. – XFreire

+1

Получение ошибок «Нет» позиции «кандидаты» создают ожидаемый тип контекстуального результата »(Observable ) -> (_) -> _'' – LynAs

0

Полный вид, что я искал

import UIKit 
import RxSwift 
import RxCocoa 

struct Person { 
    let name : String 
    let age : Int 

} 
class ViewController: UIViewController { 
    let personArray = [ 
     Person(name: "name1", age: 11), 
     Person(name: "name2", age: 12), 
     Person(name: "name3", age: 13) 
    ] 

    let disposeBag = DisposeBag() 
    var items : Observable<[Person]>! 

    @IBOutlet weak var mytable: UITableView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     items = Observable.just(personArray) 
     bindData() 
    } 

    @IBAction func prependButtonAction(_ sender: UIButton) { 
     let newPersonArray = [ 
      Person(name: "name -3", age: 11), 
      Person(name: "name -4", age: 12) 
     ] 
     prependData(dataToPrepend: newPersonArray) 
    } 

    @IBAction func appendButtonAction(_ sender: UIButton) { 
     let newPersonArray = [ 
      Person(name: "name 6", age: 11), 
      Person(name: "name 7", age: 12) 
     ] 
     appendData(dataToAppend : newPersonArray) 
    } 



    private func bindData() { 
     mytable.dataSource = nil 
     items.bindTo(mytable.rx.items(cellIdentifier: "cell")) { (row, person, cell) in 
      if let cellToUse = cell as? TableViewCell { 
       cellToUse.label1.text = person.name 
       cellToUse.label2.text = "\(person.age)" 
      } 
     }.addDisposableTo(disposeBag) 
    } 

    private func prependData(dataToPrepend : [Person]) { 
     let newObserver = Observable.just(dataToPrepend) 
     items = Observable.combineLatest(items, newObserver) { 
      $1+$0 
     } 
     bindData() 
    } 


    private func appendData(dataToAppend : [Person]) { 
     let newObserver = Observable.just(dataToAppend) 
     items = Observable.combineLatest(items, newObserver) { 
      $0+$1 
     } 
     bindData() 
    } 
} 
Смежные вопросы