UICollectionViewDelegate в RxCocoa - PullRequest
       22

UICollectionViewDelegate в RxCocoa

0 голосов
/ 04 ноября 2018

Я пишу расширение для UICollectionView, которое будет слушать делегата Метод shouldHighlightItemAt, но он не вызывается.

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 rx shouldHighlightItemAt?

1 Ответ

0 голосов
/ 04 ноября 2018

Нельзя использовать 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 и изменил в соответствии с вашими потребностями. Так что в теории это должно работать, но вам, возможно, придется немного его настроить; -)

...