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)
私はどこかにこの可能性を示しましたが、それを思い出すことはできません。それを行う方法について何か考えがありますか?
indexPath
とmodel
の両方が必要な場合は、2つのメソッドを組み合わせて、1つの監視可能なシーケンスのみに変換できます。
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)
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)
_
また、itemSelected
コマンドの後にdo(onNext:{...})
を追加する別の方法を見つけました。
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)