IOS,UIView,检测子视图中的隐藏状态变化
有无论如何检测UIView(而不是UIViewController)子视图中的隐藏状态更改(或其他更改)。 想以某种方式检测这个asynchronous。
我有些疯狂的原因。
您可以使用KVO(键值观察)来检测对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
属性改变其值时被调用。 如果我没有弄错,这个方法将在线程的上下文中被同步地调用,以此来改变属性。 如果你需要asynchronous通知你可以自己添加,例如通过使用NSObject
方法performSelector:withObject:afterDelay:
或者performSelector:onThread:withObject:waitUntilDone:
顺便说一句:你不需要在观察者方法中的检查,显然,如果你只观察一个对象和/或财产。 为了说明的目的,我离开了支票。 我也推荐阅读苹果关于KVO和KVC (关键值编码)的文档,以了解这里发生了什么。
即使观察者被释放,运行时也会继续通知你的观察者 – 导致应用程序崩溃! 所以不要忘记在解除分配之前移除观察者,最迟在观察者的dealloc
发生:
- (void) dealloc { UIView* viewToObserve = [self getViewToObserve]; [viewToObserve removeObserver:self forKeyPath:@"hidden"]; [super dealloc]; }