使用KVO观察UIView的子视图数组中的更改

Liz*_*zza 12 objective-c key-value-observing subview uiview ios

我已经四处寻找答案,我试图实现它,但没有任何工作.基本上,我需要能够观察VC视图的子视图数组中的更改.如果从该数组中删除现有视图,我希望收到有关它的通知并运行一些代码.

可能吗?

编辑 - 更多信息

我正在尝试修复一个奇怪的边缘案例错误,快速点击UISearchDisplayController(非常自定义)的UISearchBar会导致sdController(或者更确切地说是navBar效果中的托管searchBar)从视图中消失,但sdController仍然是STILL活性.这意味着navBar停留在-y原点,下面的tableView不可滚动.

我最初的想法是进入sdController处于活动状态,但UISearchDisplayControllerContainerView不在视图层次结构中.我尝试在VC的viewDidLayoutSubviews中测试它,但是当你点击搜索栏并启动sdController动画时,sdController处于活动状态,而UISearchDisplayControllerContainerView不在视图层次结构中:(.

小智 16

您可以观察sublayers符合KVO的CALayer 属性,而不是UIView subviews.

  • 这确实有效。很好的解决方法! (2认同)
  • 请提供一个文档链接,说明一般的核心动画或特别是 CALayer 的子视图符合 KVO。据我了解,他们不是。(注意:KVC 合规并不意味着 KVO 合规)。 (2认同)
  • 代码: [v.layer addObserver:self forKeyPath:@"sublayers" options:NSKeyValueObservingOptionNew context:nil]; (2认同)

Nik*_*uhe 4

与 Apple 框架中的大多数属性一样,subviews 它不符合 KVO

如果您控制子视图或超级视图,您可以通过子类化和覆盖来观察视图层次结构的更改:

在超级视图中你必须覆盖...

- (void)willRemoveSubview:(UIView *)subview
Run Code Online (Sandbox Code Playgroud)

...或者,如果您控制子视图,您将覆盖...

- (void)willMoveToSuperview
Run Code Online (Sandbox Code Playgroud)

这两个方法都会在视图被删除之前调用。