2016-08-22 2 views
9

Я удивлен, есть ли какой-либо пример кода для RxSwift, когда я могу использовать несколько пользовательских ячеек в одном представлении таблицы. Так, например, у меня есть два раздела, и первая секция имеет 10 ячеек с идентификатором типа CellWithImage, а вторая секция имеет 10 ячеек с идентификатором типа CellWithVideo.Вид таблицы RxSwift с несколькими пользовательскими типами ячеек

Все Татс и примеры кода, которые я учрежденный использую только один тип клеток, например RxSwiftTableViewExample

Спасибо за любую помощь

ответ

3

мне удалось его с помощью RxSwiftDataSources,

это позволит вы должны использовать пользовательские ячейки с несколькими разделами.

+4

Можете ли вы поделиться кодом, каким образом вы реализовали это в конце концов? – nburk

2

В случае, если кто-то заинтересован, вот моя реализация. У меня есть приложение со списком игр. В зависимости от того, закончена или продолжается игра, я использую разные ячейки. Вот мой код:

В ViewModel, у меня есть список игры, разделить их на готовую/текущие те и сопоставить их с SectionModel

let gameSections = PublishSubject<[SectionModel<String, Game>]>() 
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Game>>() 

... 

self.games.asObservable().map {[weak self] (games: [Game]) -> [SectionModel<String, Game>] in 
    guard let safeSelf = self else {return []} 
    safeSelf.ongoingGames = games.filter({$0.status != .finished}) 
    safeSelf.finishedGames = games.filter({$0.status == .finished}) 

    return [SectionModel(model: "Ongoing", items: safeSelf.ongoingGames), SectionModel(model: "Finished", items: safeSelf.finishedGames)] 
}.bindTo(gameSections).addDisposableTo(bag) 

Тогда в ViewController, я связываю мои разделы моей Tableview , и использовать различные ячейки, подобные этому. Обратите внимание, что я мог бы использовать indexPath для получения правильной ячейки вместо статуса.

vm.gameSections.asObservable().bindTo(tableView.rx.items(dataSource: vm.dataSource)).addDisposableTo(bag) 
vm.dataSource.configureCell = {[weak self] (ds, tv, ip, item) -> UITableViewCell in 
    if item.status == .finished { 
     let cell = tv.dequeueReusableCell(withIdentifier: "FinishedGameCell", for: ip) as! FinishedGameCell 
     cell.nameLabel.text = item.opponent.shortName 
     return cell 
    } else { 
     let cell = tv.dequeueReusableCell(withIdentifier: "OnGoingGameCell", for: ip) as! OnGoingGameCell 
     cell.titleLabel.text = item.opponent.shortName 
     return cell 
    } 
}