tableView.rx.itemSelected 中的 RxSwift 双映射
Posted
技术标签:
【中文标题】tableView.rx.itemSelected 中的 RxSwift 双映射【英文标题】:RxSwift double mapping in tableView.rx.itemSelected 【发布时间】:2017-10-02 07:20:53 【问题描述】:我想从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)
我在某处展示了这种可能性,但不记得了。你知道怎么做吗?
【问题讨论】:
你为什么不在map
函数中返回viewModel.items[indexPath.row]
?
@NikitaErmolenko 在这种情况下我得到错误:类型'Observable'没有下标成员
viewModel.items
是什么类型的?
它是:var items: Observable
【参考方案1】:
如果您同时需要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)
【讨论】:
不是最优解,因为***.com/a/60926473/7104327 Here【参考方案2】: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 处理。【参考方案3】:我还找到了其他方式在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)
【讨论】:
以上是关于tableView.rx.itemSelected 中的 RxSwift 双映射的主要内容,如果未能解决你的问题,请参考以下文章