Нельзя использовать methodInvoked(_:)
с методом делегата, который имеет тип возврата не void.
collectionView(_:shouldHighlightItemAt:)
ожидает, что вы вернете значение Bool
. Таким образом, вы не можете использовать methodInvoked(_:)
.
Если вы посмотрите на реализацию methodInvoked(_:)
, она даст вам объяснение, почему это не работает:
Методы делегатов, которые не имеют возвращаемого значения void
, не могут наблюдаться
напрямую используя этот метод
потому что:
эти методы предназначены не для использования в качестве механизма уведомления, а в качестве механизма настройки поведения
не существует разумного автоматического способа определения возвращаемого значения по умолчанию
Однако есть предложение, как вы могли бы достичь того, что вы пытаетесь сделать:
В случае, если наблюдение за методами-делегатами с возвращаемым типом
требуется, это может быть сделано
установка PublishSubject
или BehaviorSubject
вручную и реализация метода делегата.
В вашем случае это будет работать так:
В RxCollectionViewDelegateProxy
вы добавляете SubjectSubject и реализуете метод UICollectionViewDelegate
:
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 вы можете выставить желаемую наблюдаемую форму следующим образом:
public var property: Observable<IndexPath> {
let proxy = RxCollectionViewDelegateProxy.proxy(for: base)
return proxy.shouldHighlightItemAtIndexPathSubject.asObservable()
}
Я не проверял это, я просто взял его из исходного кода RxCocoa и изменил в соответствии с вашими потребностями. Так что в теории это должно работать, но вам, возможно, придется немного его настроить; -)