IOS,UIView,检测子视图中的隐藏状态变化

时间:2013-06-10 22:02:52

标签: ios uiview subview

无论如何都要在UIView(不是UIViewController)的子视图中检测隐藏状态更改(或其他更改)。想以某种方式检测到这种异步。

我的疯狂是有原因的。

2 个答案:

答案 0 :(得分:17)

您可以使用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属性更改其值,就会调用observer方法。如果我没有弄错的话,将在进行属性更改的线程的上下文中同步调用该方法。如果您需要异步通知,可以自行添加,例如使用NSObject方法之一performSelector:withObject:afterDelay:performSelector:onThread:withObject:waitUntilDone:

BTW:显然,如果您只观察单个对象和/或属性,则不需要使用观察者方法进行检查。为了便于说明,我把支票留了下来。我还建议在KVOKVC(键值编码)上阅读Apple的文档,以了解这里发生了什么。

即使观察者被解除分配,运行时也会继续通知您的观察者 - 导致应用程序崩溃!所以不要忘记在解除分配之前移除观察者,最迟这应该发生在观察者的dealloc

- (void) dealloc
{
    UIView* viewToObserve = [self getViewToObserve];
    [viewToObserve removeObserver:self forKeyPath:@"hidden"];
    [super dealloc];
}

答案 1 :(得分:3)

您可以覆盖 UIView 子类中的属性并在 didSet 中执行任何操作

class MyView: UIView {
   override var isHidden: Bool {
        didSet {
            //do something
        }
    }
}