无论如何要在 UIView(不是 UIViewController)的子视图中检测隐藏状态更改(或其他更改)。想以某种方式检测到这种异步。
我的疯狂是有原因的。
您可以使用 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
每当属性更改其值时,都会调用观察者方法。如果我没记错的话,该方法将在对属性进行更改的线程的上下文中同步调用。如果您需要异步通知,您可以自己添加,例如使用其中一种NSObject
方法performSelector:withObject:afterDelay:
或performSelector:onThread:withObject:waitUntilDone:
.
顺便说一句:显然,如果您只观察单个对象和/或属性,则不需要在观察者方法中进行检查。出于说明目的,我留下了支票。我还建议阅读 Apple 关于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
}
}
}