“hidden”vs #keyPath(UIView.isHidden)

时间:2017-01-19 16:23:01

标签: ios swift swift3

带有#keyPath(UIView.isHidden)

KVO 观察员不起作用,但"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("*");
    }
}

1 个答案:

答案 0 :(得分:9)

  

是错误还是功能?

让我们说这是一个众所周知的事实。 " Renamification"意味着Swift假装Objective-C Bool属性的名称以is...开头,即使它没有。但是当涉及到KVO和属性设置器名称时,#keyPath机制没有得到备忘录,并且实现KVO观察的属性设置器调整纯粹是一个Objective-C功能,所以你必须使用 real 属性/ setter的名称,即Objective-C名称,以便与Objective-C的通信可以正常用于KVO观察目的。

我已经提交了一份关于它的错误报告(https://bugs.swift.org/browse/SR-2415),理由是斯威夫特可以对此表现得更聪明一点,但是直到斯威夫特团伙做出回应,这只是你拥有的东西知道并处理。