RxSwift,如何在不使用RxDataSourced的情况下绘制tableView?

时间:2018-01-18 07:34:22

标签: ios swift datasource rx-swift rx-cocoa

我无法弄清楚如何处理您的数据源。 我观看了RxSwift和RxCocoa的课程,并意识到对于复杂的表,您需要使用数据源。找到了一个库RxDataSourced但我们不允许使用它。决定编写自己的dataSource但没有发生任何事情。如果你不介意,你可以展示写数据的例子。在互联网上找不到任何内容。

class RXSpecificationsDataSource: NSObject, RxTableViewDataSourceType, UITableViewDataSource {
    typealias Element = MaterialEntityRootGroupProperty

    var _sectionModels: [MaterialEntityRootGroupProperty] = []


     public typealias ConfigureCell = (RXSpecificationsDataSource, UITableView, IndexPath) -> UITableViewCell



    func tableView(_ tableView: UITableView, observedEvent: Event<RXSpecificationsDataSource.Element>) { }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard _sectionModels.count > section else { return 0 }
       return _sectionModels[section].properties.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        precondition(indexPath.item < _sectionModels[indexPath.section].properties.count)  return ConfigureCell(self, tableView, indexPath, self[indexPath])

    }

    func numberOfSections(in tableView: UITableView) -> Int {
       return _sectionModels.count
    }
}

final class MaterialDetailSpecificationsView: UserInterface {

    private var specificationTableView: UITableView!
    private let disposeBag = DisposeBag()

    func setupView(items: Variable<[MaterialEntityRootGroupProperty]>) {
        setNabigationParms()
        drawTableViewSpecifications()

        let dataSource = RXSpecificationsDataSource ()

        dataSource.configureCell = { (dataSource, tv, indexPath, element) in
            let cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
            cell.textLabel?.text = "\(element) @ row \(indexPath.row)"
            return cell
        }

        items.asObservable()
            .bind(to: specificationTableView.rx.items(dataSource: dataSource))
            .disposed(by: disposeBag)



    }

1 个答案:

答案 0 :(得分:1)

您只需将RxDataSources绑定到表即可。在RxCocoa中已经有UITableView和UICollectionView的内置绑定,你可以在这里看到更多的信息:

RxDataSources repo内有RxDataSources实际上是如何做到这一点的一个例子;-)

let data = Observable<[String]>.just(["first element", "second element", "third element"])

data.bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, model, cell in
  cell.textLabel?.text = model
}
.disposed(by: disposeBag)

https://github.com/RxSwiftCommunity/RxDataSources#why