IOS、UIView、检测子视图隐藏状态变化

Posted

技术标签:

【中文标题】IOS、UIView、检测子视图隐藏状态变化【英文标题】:IOS, UIView, Detect Hidden State Change in Subview 【发布时间】:2013-06-10 22:02:52 【问题描述】:

是否有办法在 UIView(不是 UIViewController)的子视图中检测隐藏状态更改(或其他更改)。想以某种方式检测到这种异步。

我的疯狂是有原因的。

【问题讨论】:

带“隐藏状态变化”,是指属性hidden的值发生变化吗? 如何使用 KVO 观察每个子视图的隐藏属性(以及子视图集合,以便您知道何时添加/删除视图)? 【参考方案1】:

您可以使用 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
    
  

只要hiddenproperty 更改其值,就会调用观察者方法。如果我没记错的话,该方法将在对属性进行更改的线程的上下文中同步调用。如果您需要异步通知,您可以自己添加,例如使用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];

【讨论】:

[self.deleteButton addObserver:self forKeyPath:@"hidden" options:0 context:nil];更改 self.deleteButton.hidden 时不会触发。【参考方案2】:

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

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

【讨论】:

以上是关于IOS、UIView、检测子视图隐藏状态变化的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 隐藏视图动画

ios检测终止状态下的蓝牙状态变化

ios检测终止状态下的蓝牙状态变化

关闭当前视图控制器时 UIView 框架发生变化

iOS - 带有布局指南的 UITabBar 上方的 UIView

将元素添加为子视图后,元素位置发生变化