某些 UIView 属性上的 RxSwift `observeWeakly` 失败,而 `observe` 确实有效

RxSwift `observeWeakly` on certain UIView properties fails while `observe` does work

问题很简单:

我有以下扩展来使用 RxSwift 订阅 UIView 的 alphahidden 属性。但是这个错误 invalidPropertyName 错误。

只需将 observeWeakly 替换为 observe 即可修复错误,但我宁愿不这样做以防止可能的保留周期。 完全相同的代码确实适用于框架和边界等属性,据我所知,至少 hidden 是符合 KVO 的 属性.

这是一个已知问题,还是有任何其他方法可以在针对 iOS 12.0 时观察这些属性?

有问题的代码:

extension Reactive where Base: UIView {
    
    
    var observeAlpha: Observable<CGFloat?> {
        get {
            return observeWeakly(CGFloat.self, "alpha")
                .do(
                    onError: {
                        print([=10=])
                    }
                )
                .catchErrorJustReturn(1.0)
                .startWith(base.alpha)
        }
    }

    
    var observeIsHidden: Observable<Bool?> {
        get {
            return observeWeakly(Bool.self, "hidden")
                .do(
                    onError: {
                        print([=10=])
                    }
                )
                .catchErrorJustReturn(false)
                .startWith(base.isHidden)
        }
    }
}

两个错误:

Object `<UIView: 0x7f9a4654a170; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x600002464940>>` doesn't have a property named `alpha`.
Object `<UITransitionView: 0x7f9a4654a170; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x600002464940>>` doesn't have a property named `hidden`.

我看起来像 observe 运算符直接存储键路径,而 observeWeakly 试图解析它。对我来说,后一个代码似乎有一个错误。

解决方案是不要像使用模型一样使用您的视图。 alpha 值更改的唯一方法是设置它。与其观察视图的 alpha 或隐藏属性,不如观察导致这些属性发生变化的任何原因。