IOS,UIView,检测子视图中隐藏状态的更改

13

有没有办法检测UIView中一个子视图的隐藏状态改变(或其他变化),并异步地进行检测?注意这是在UIView而不是UIViewController中。

我这样做是有原因的。


“hidden state change”指的是更改hidden属性的值吗? - herzbube
使用KVO观察每个子视图的隐藏属性(以及子视图集合),这样您就可以知道何时添加/删除视图。 - lnafziger
2个回答

20
你可以使用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:

顺便说一句:如果您只观察单个对象和/或属性,则不需要在观察者方法中进行检查。我留下了这些检查以说明目的。我还建议阅读苹果关于KVOKVC(键值编码)的文档,以了解这里发生了什么。

即使观察者已被释放,运行时仍然会愉快地继续通知您的观察者 - 导致应用程序崩溃!因此,在观察者的dealloc中最迟应该在释放观察者之前删除观察者:

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

当self.deleteButton.hidden被改变时,[self.deleteButton addObserver:self forKeyPath:@"hidden" options:0 context:nil];没有触发。 - ort11

4

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接