KVO observer with #keyPath(UIView.isHidden)
does not work, but "hidden"
works.
Very strange. Is it bug or feature?
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("*");
}
}
visible: It is used to specify the element to be visible. It is a default value. hidden: Element is not visible, but it affects layout.
Difference between display:none and visiblity: hidden visibility:hidden hides the element, but it still takes up space in the layout. display:none removes the element from the document. It does not take up any space.
The opposite of visibility: hidden is visibility: visible .
display:none will hide the whole element and remove that from layout space whereas visibility:hidden hides an element but take up the same space as before. Opacity can be used if you want to create transparency or fade effect. Save this answer.
Is it bug or feature?
Let's say it's a known fact. "Renamification" means that Swift pretends that the name of an Objective-C Bool property starts with is...
even when it doesn't. But the #keyPath
mechanism didn't get the memo when it comes to KVO and property setter names, and property setter swizzling to implement KVO observing is purely an Objective-C feature, so you have to use the real name of the property / setter, i.e. the Objective-C name, so that communication with Objective-C works correctly for KVO observation purposes.
I've filed a bug report on it (https://bugs.swift.org/browse/SR-2415) on the grounds that Swift could behave a little smarter about this, but until the Swift gang respond, it's just something you have know and deal with.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With