tableView.rx.itemSelected中的RxSwift双映射

时间:2017-10-02 07:20:53

标签: ios uitableview rx-swift rx-cocoa

我希望从tableView.rx.itemSelected获取对象并在处理之后。此方法返回IndexPath,因此我可以映射此值。但是如何从ViewModel

获取索引对象
struct ViewModel {
    var items: Observable<[Item]>
}

近似我期待这样的事情(但这个流程是错误的):

tableView.rx.itemSelected
        .map { indexPath -> Item in 
        return viewModel.items.map {$0[indexPath.row]}
        }
        ..subscribe(onNext: { [unowned self] item in
        //other actions with Item object
        })
        .disposed(by: disposeBag)

我在某处展示了这种可能性,但无法回想起来。你知道怎么做吗?

3 个答案:

答案 0 :(得分:25)

如果您同时需要indexPathmodel,则可以将两种方法组合在一起并仅在一个可观察序列中进行转换:

Observable
    .zip(tableView.rx.itemSelected, tableView.rx.modelSelected(String.self))
    .bind { [unowned self] indexPath, model in
        self.tableView.deselectRow(at: indexPath, animated: true)
        print("Selected " + model + " at \(indexPath)")
    }
    .disposed(by: disposeBag)

答案 1 :(得分:7)

RxCocoa有两种方法:

public var itemSelected: ControlEvent<IndexPath> { get }返回所选项目的IndexPath
public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T>返回模型元素
根据你的例子,它将看起来:

    tableView.rx.modelSelected(Item.self)
        .subscribe(onNext: { [weak self] item in
            // other actions with Item object
        }).addDisposableTo(disposeBag)

答案 2 :(得分:0)

我还发现了在do(onNext:{...})命令后添加itemSelected的其他方法:

tableView.rx
    .itemSelected
    .do(onNext: { [unowned self] indexPath in
        self.tableView.deselectRow(at: indexPath, animated: false)
    })
    .map { indexPath -> Item in 
        return viewModel.items.map {$0[indexPath.row]}
    }
    .subscribe(self.viewModel.reviewTimeAction.inputs)
    .disposed(by: disposeBag)