首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UICollectionViewDelegate in RxCocoa

UICollectionViewDelegate in RxCocoa
EN

Stack Overflow用户
提问于 2018-11-04 16:10:23
回答 1查看 370关注 0票数 2

我为UICollectionView编写了一个扩展,它将侦听委托的shouldHighlightItemAt方法,但它不会调用。

代码语言:javascript
复制
public var shouldHighlightItem: ControlEvent<IndexPath> {

    let source = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:shouldHighlightItemAt:)))
        .map { a in
            return try self.castOrThrow(IndexPath.self, a[1])
    }

    return ControlEvent(events: source)
}

}

如何为UICollectionView of rx shouldHighlightItemAt编写扩展?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 18:24:26

不能将methodInvoked(_:)与具有非空返回类型的委托方法一起使用。

collectionView(_:shouldHighlightItemAt:)希望您返回一个Bool值。所以您不能使用methodInvoked(_:)

如果您看一下methodInvoked(_:)的实现,它会给出为什么不起作用的解释:

不能使用此方法直接观察具有非void返回值的委托方法,因为:

  • 这些方法不打算用作通知机制,而是用作行为自定义机制。
  • 没有确定默认值的合理的自动方法。

然而,有一个建议是,你如何才能实现你想要做的事情:

如果需要观察具有返回类型的委托方法,则可以手动安装PublishSubjectBehaviorSubject并实现委托方法。

在你的例子中,它是这样工作的:

RxCollectionViewDelegateProxy UICollectionViewDelegate 中添加“PublishSubject”并实现UICollectionViewDelegate方法:

代码语言:javascript
复制
let shouldHighlightItemAtIndexPathSubject = PublishSubject<IndexPath>

public func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
    shouldHighlightItemAtIndexPathSubject.on(.next(indexPath))
    return self._forwardToDelegate?.collectionView(collectionView, shouldHighlightItemAt: indexPath) ?? true // default value
}

在您的UICollectionView RxExtension中,您可以像下面这样公开所需的可观察到的内容:

代码语言:javascript
复制
public var property: Observable<IndexPath> {
    let proxy = RxCollectionViewDelegateProxy.proxy(for: base)
    return proxy.shouldHighlightItemAtIndexPathSubject.asObservable()
}

我还没有对此进行测试,我只是从RxCocoa源代码中提取并修改了它,以满足您的需要。因此,从理论上讲,这是可行的,但您可能需要稍微调整一下;-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53142723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档