2017-01-19 2 views
3

KVOオブザーバ#keyPath(UIView.isHidden)で動作しませんが、"hidden"が機能します。「隠し」vs #keyPath(UIView.isHidden)

非常に奇妙です。バグか機能ですか?

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

これは(Objective-Cで)次のように宣言されているという事実に関連していますか? '@property(nonatomic、getter = isHidden)BOOL hidden;'、isHidden'はゲッターだけでプロパティは ' /パス"? – Larme

+2

#keyPathのオートコンプリート(UIView .___)は、「非表示」ではなく「isHidden」を挿入することを示します。 – john07

答えて

6

それはバグや機能ですか?

これは既知の事実です。 「改名」とは、SwiftがObjective-C Boolプロパティの名前がis...で始まっていない場合でもそれがふりをすることを意味します。しかし、#keyPath機構は、KVOとプロパティーセッター名に関してはメモを取得しませんでした.KVO観察を実装するためのプロパティーセッターのSwizzlingはObjective-Cの機能であるため、のrealプロパティ/ Objective-Cとの通信がKVO観測の目的で正しく動作するように、Objective-Cの名前を使用します。

私はSwiftがこれについて少しスマートに動作する可能性があるという理由で、バグレポート(https://bugs.swift.org/browse/SR-2415)を提出しましたが、Swiftギャングが応答するまでは、あなたが知っていて対処しているものです。

+0

私のバグ報告を積み重ねてください。 – matt

関連する問題