RxSwift访问indexPath.section

时间:2017-05-18 09:16:22

标签: ios swift uitableview rx-swift indexpath

我是Rxswift的全新人,有没有办法在RxSwift中做这个场景?

我得到的是这个..但问题是我没有indexPath

datasource.sectionModels
        .asObservable()
        .bindTo(tableView.rx.items) { tableView, row, element in
            guard let sectionType = SectionType(rawValue: indexPath.section) else { return 0 }

            let indexPath = IndexPath(row: row, section: 0)

            var itemForIndexPath: SectionViewModel {
                return self.datasource.sectionModels.value[indexPath.section]
            }

            switch sectionType {
            case .nickTitle, .nickIfno:
                let infoCell = tableView.dequeueReusableCell(
                    withIdentifier: InfoTableViewCell.name,
                    for: indexPath
                    ) as! InfoTableViewCell

                var datasource: InfoCellDatasourceProtocol = InfoCellNormalState(text: itemForIndexPath.text)
                if itemForIndexPath.errorStyle {
                    datasource = InfoCellErrorState(text: itemForIndexPath.text)
                }

                infoCell.configureCell(datasource: datasource)
            }

这就是我在RxSwift中所需要的

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let sectionType = SectionType(rawValue: indexPath.section) else { return UITableViewCell() }

    var itemForIndexPath: SectionViewModel {
        return self.datasource.sectionModels.value[indexPath.section]
    }

    switch sectionType {
    case .nickTitle, .nickInfo:
        let infoCell = tableView.dequeueReusableCell(
            withIdentifier: InfoTableViewCell.name,
            for: indexPath
            ) as! InfoTableViewCell

        var datasource: InfoCellDatasourceProtocol = InfoCellNormalState(text: itemForIndexPath.text)
        if itemForIndexPath.errorStyle {
            datasource = InfoCellErrorState(text: itemForIndexPath.text)
        }

        infoCell.configureCell(datasource: datasource)

        return infoCell

datasource片段:

open class RegistrationNickDataSource: NickDatasourceProtocol {
    public var error: Variable<ErrorType>?
    public var success: Variable<Bool> = Variable(false)
    fileprivate let request = ValidateNameRequest()


    public var nickHints: Variable<[String]>?
    public var sectionModels: Variable<[SectionViewModel]> =  Variable([
    SectionViewModel(
        text: "your_nick_hint".localized,
        type: .info,
        errorStyle: false
    ),
    SectionViewModel(
        text: "your_nick_placeholder".localized,
        type: .input,
        errorStyle: false
    ),
    SectionViewModel(
        text: "your_nick_info".localized,
        type: .info,
        errorStyle: false
    )]
)

感谢您的每一次帮助

2 个答案:

答案 0 :(得分:3)

以下是repo制作分段表视图的示例:

https://github.com/ReactiveX/RxSwift/blob/master/RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift

它的结果是你必须实例化一个RxTableViewSectionedReloadDataSource

但是,我没有在你的代码中看到你实际上有哪些部分。 UITableView中的部分暗示了一个二维数组,你只有一维数组...

答案 1 :(得分:3)

我建议使用RxDataSources。当您致电configureCell时,它会让您访问单元格的索引路径。

您的数据源和单元格将使用以下内容进行配置:

func setupDataSource() 
{
    let dataSource = RxTableViewSectionedReloadDataSource<MySection>()

    dataSource.configureCell = { (theDataSource: TableViewSectionedDataSource<MySection>,                     
                                  theTableView,         
                                  theIndexPath,                                  
                                  item: MyItem) in
        let cell = theTableView.dequeueReusableCell(withIdentifier: InfoTableViewCell.name,
                                                    for: theIndexPath) as! InfoTableViewCell

        /* Do any setup of the cell here. */

        return cell;
    }       

    dataSource.titleForHeaderInSection = { theDataSource, index in
        return theDataSource.sectionModels[index].header;
    }
}

如果在获取要接受的类型时遇到问题,可以省略闭包参数中的类型。斯威夫特可以为你推断它们。

为您的自定义数据源设置结构,包括您的剖面模型,如下所示:

/// Holds data to display.
struct MyItem
{
    var text: String
    var type: MyCustomEnum
    var errorStyle: Bool
}

/// Defines a section type for use with sections for the table.
struct MySection
{
    var header: String
    var items: [Item]
}

/// Tie your custom data model to SectionModelType.
extension MySection: SectionModelType
{
    typealias Item = MyItem

    init(original: MySection,
         items: [Item])
    {
        self = original
        self.items = items
    }
}

倒数第二步是通过将您的部分放入Observable来绑定数据源。以下代码是函数sections()返回类型为Observable<[MySection]>的Observable的示例:

sections()
    .bind(to: tableView.rx.items(dataSource: dataSource))
    .disposed(by: bag)

最后,可以使用以下方式获取数据:

 override func viewDidLoad()
 {
     super.viewDidLoad()
     setupDataSource()
 }