如何在 RxSwift 中选择 CollectionView 的单元格

17

我需要使用RxSwift在集合视图中按特定索引选择项目。这种方法不起作用。

 collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag) 

有人能帮忙吗?


你在哪里声明了disposeBag? - xandrefreire
在ViewDidLoad()之外 - Mehreen
当你说它“不正常工作”时,这是什么意思?有任何反应吗?如果有,会发生什么?-- 你是否通过断点检查了 menuItem 是否根据你点击的单元格具有正确的值? - dsapalo
你可以尝试使用 debug 运算符进行调试 - 只需在 .subscribe 之前添加以下内容: .debug("RX: Model selected"),并查看幕后发生了什么(是否已订阅?可能不止一次?也可能在有机会发出任何内容之前被处理掉了)。 - goldengil
根据RxCocoa文档,只有在使用rx.items重载之一填充表格时才能使用modelSelected(:)。您是否正在使用其中一个重载?另一个要检查的事项是确保您的代码中没有设置表格的委托。 - Paul
2个回答

38

如果您想获取所选项目的indexPath,可以使用以下方法:

collectionView
    .rx
    .itemSelected
        .subscribe(onNext:{ indexPath in
            //your code
        }).disposed(by: disposeBag)

如果您希望选中该模型:

collectionView
        .rx
        .modelSelected(SearchResult.self)
        .subscribe(onNext: { (model) in
            //Your code
        }).disposed(by: disposeBag)

你可以将上述内容结合起来,按以下方式获取具有其indexPath的modelSelected:

  Observable
            .zip(
                collectionView
                    .rx
                    .itemSelected
                ,collectionView
                    .rx
                    .modelSelected(SearchResult.self)
            )
            .bind{ [unowned self] indexPath, model in

            }
            .disposed(by: disposeBag)
    }

3

在 mojtaba al moussawi 的回答基础上,我做了一个扩展来简化压缩:

extension Reactive where Base: UICollectionView {
    public func modelAndIndexSelected<T>(_ modelType: T.Type) -> ControlEvent<(T, IndexPath)> {
        ControlEvent(events: Observable.zip(
            self.modelSelected(modelType),
            self.itemSelected
        ))
    }
}

你会使用它类似于:

collectionView
    .rx
    .modelAndIndexSelected(SearchResult.self)
    .subscribe(onNext: { (model, index) in
        //Your code
    }).disposed(by: disposeBag)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接