一尘不染

“隐藏”与#keyPath(UIView.isHidden)

swift

*与 *KVO的 观察者#keyPath(UIView.isHidden)不起作用,但是"hidden"起作用。

很奇怪。它是错误还是功能?

child.addObserver(self, forKeyPath: "hidden", options: [.initial,.new], context: nil);

override func observeValue(forKeyPath keyPath: String?, of object: Any?, .change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let view = object as? UIView, view.superview === self && keyPath == "hidden" {
        print("*");
    }
}

阅读 452

收藏
2020-07-07

共1个答案

一尘不染

它是错误还是功能?

假设这是一个已知的事实。“重命名”意味着Swift假装Objective-C
Bool属性的名称以is...它开头,即使不是这样。但是,#keyPath当涉及到KVO和属性设置器名称时,该机制没有得到备忘,并且繁琐的属性设置器实现KVO观察纯粹是一个Objective-
C功能,因此您必须使用属性/设置器的 真实 名称,即Objective-C名称,以便出于观察KVO的目的与Objective-C的通信正常进行。

我已就此提交了一个错误报告(https://bugs.swift.org/browse/SR-2415),理由是Swift对此可能表现得更聪明,但在Swift帮派回应之前,这只是您的事情知道并处理。

2020-07-07