IOS,UIView,检测 subview 中的隐藏状态变化

标签 ios uiview subview

无论如何,是否可以检测 UIView(而非 UIViewController)的 subview 中的隐藏状态更改(或其他更改)。想以某种方式检测这种异步。

我的疯狂是有原因的。

最佳答案

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

关于IOS,UIView,检测 subview 中的隐藏状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17033581/

相关文章:

objective-c - 使用 UIImage 黑白 iOS 屏蔽 UIView

ios - 更新 ios 和 xcode 后部署出现错误 “Xcode cannot find the software image to install this version”

swift - 在特定持续时间后删除 subview

objective-c - 将 UIView 作为 subview 添加到 UITableViewController 的 View 中

ios - 月份标题没有向左移动 FSCALENDAR

ios - Angular 2 数字键盘启动

ios - 用于自定义 UIVIew 的 UI_APPEARANCE_SELECTOR

iphone - 在 ViewController 类之外添加 UIView 类以显示 subview

iphone - 自定义 UIView 子类作为 UIViewController 属性

ios - UIView原点不等于0