有没有办法检测UIView中一个子视图的隐藏状态改变(或其他变化),并异步地进行检测?注意这是在UIView而不是UIViewController中。
我这样做是有原因的。
hidden
的值是否发生了变化。self
):UIView* viewToObserve = [self getViewToObserve]; // implement getViewToObserve
[viewToObserve addObserver:self forKeyPath:@"hidden" options:0 context:NULL];
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
UIView* viewToObserve = [self getViewToObserve];
if (object == viewToObserve)
{
if ([keyPath isEqualToString:@"hidden"])
{
// react to state change
}
}
}
hidden
属性更改其值时被调用。如果我没错的话,该方法将在使属性更改的线程上下文中同步调用。如果您需要异步通知,可以自己添加,例如使用NSObject
方法之一performSelector:withObject:afterDelay:
或performSelector:onThread:withObject:waitUntilDone:
。
顺便说一句:如果您只观察单个对象和/或属性,则不需要在观察者方法中进行检查。我留下了这些检查以说明目的。我还建议阅读苹果关于KVO和KVC(键值编码)的文档,以了解这里发生了什么。
即使观察者已被释放,运行时仍然会愉快地继续通知您的观察者 - 导致应用程序崩溃!因此,在观察者的dealloc
中最迟应该在释放观察者之前删除观察者:
- (void) dealloc
{
UIView* viewToObserve = [self getViewToObserve];
[viewToObserve removeObserver:self forKeyPath:@"hidden"];
[super dealloc];
}
您可以在UIView子类中覆盖该属性,并在didSet
中执行任何操作。
class MyView: UIView {
override var isHidden: Bool {
didSet {
//do something
}
}
}
hidden
属性的值吗? - herzbube