3

RxSwift用来将模型数组绑定到集合视图

如何从给定的 indexPath 获取模型对象?

我正在做这样的绑定:

vm.bikeIssueCatagories()
        .drive(self.collectionView.rx.items(cellIdentifier: "BikeIssueCategoryCollectionViewCell", cellType: UICollectionViewCell.self)) { row, data, cell in
        }.disposed(by: disposeBag)

我的问题的核心是,我需要同时获取模型对象和用户选择的单元格。Using collectionView.rx.modelSelected(T.self)only 给了我模型 og type T。打电话collectionView.rx.itemSelected只会给我选择的IndexPath

collectionView.rx.itemSelected.asDriver()
        .driveNext { [unowned self] indexPath in
            guard let model = try? collectionView.rx.model(at: indexPath) else { return }
            guard let cell = self.collectionView.cellForItem(at: indexPath) else { return }
        }.disposed(by: disposeBag)

但这在尝试使用 indexPath 的模型时给了我一个错误:

类型“inout UICollectionView”不符合协议“ReactiveCompatible”

尝试一下:

let indexPath = IndexPath.init()
self.collectionView.rx.model(at: indexPath)

也给了我一个错误:

对成员 'model(at:)' 的模糊引用

SO...如何同时获取模型对象和用户选择的单元格?

4

3 回答 3

6

我本可以像 RamwiseMatt 提议的那样做。在我的 ViewModel 上创建一个接受IndexPath并返回模型的方法。然而,我最终使用了zip

let modelSelected = collectionView.rx.modelSelected(SelectableBikeIssueCategory.self).asObservable()

let cellSelected = collectionView.rx.itemSelected.asObservable()
            .map { [weak self] indexPath -> UICollectionViewCell in
                guard let cell = self?.collectionView.cellForItem(at: indexPath) else { fatalError("Expected cell at indexpath") }
                return cell
            }

Observable.zip(cellSelected, modelSelected)
            .map { [weak self] cell, category -> SomeThing in
                return SomeThing()
            }
于 2017-10-23T15:05:29.690 回答
2

您的自我接受的解决方案不是最佳的,因为 modelSelected 流在内部映射 indexPath 并且需要在不需要了解 indexPath 时使用。在您的情况下,最好使用 itemSelected 并转换为例如元组。

 collectionView.rx.itemSelected
    .map { [weak self] indexPath in
            guard
               let model = try? self?.collectionView.rx.model(at: indexPath) as YourModelName?,
               let cell = self?.collectionView.cellForItem(at: indexPath)  
            else {
                preconditionFailure("Describing of error")
            }


            return (cell, model)
        }
于 2020-03-30T08:16:45.297 回答
1

您的 ViewModel 定义了一个方法bikeIssueCatagories(),这是您的 UIViewController 将 UICollectionView 绑定到的方法。要将您的模型放在正确的位置,您可以使用itemSelected您提到的属性,它会为您提供一个Observable<IndexPath>,您应该将其输入到您的 ViewModel 中。在那里,您可以使用 IndexPath 的item属性来确定您的数据数组(在 中给出bikeIssueCatagories())中的哪个模型是您要查找的模型。该modelSelected属性使您更轻松,因为它已经知道数据源,因此您只需提供模型的类型(替换T.selfYourModelName.self.)

我不确定您为什么还想要引用您的单元格,但如果必须,您可以在您的单元格上使用cellForItem(at:)UICollectionView将您通过 . 获得的 IndexPath 提供给它itemSelected。)

于 2017-10-22T22:55:34.853 回答