11

我想从中获取对象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)

我在某处展示了这种可能性,但不记得了。你知道怎么做吗?

4

3 回答 3

40

如果您需要两者indexPath,并且model您可以结合这两种方法并仅将它们转换为一个可观察的序列:

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)
于 2018-01-09T15:06:14.163 回答
10

RxCocoa 有 2 种方法:

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)
于 2017-10-04T08:11:32.330 回答
2

我还找到了其他方式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)
于 2019-03-27T21:10:00.617 回答