【问题标题】:iOS Detect subviews being added to UIViewContoller's viewiOS 检测添加到 UIViewContoller 视图的子视图
【发布时间】:2014-12-03 21:37:49
【问题描述】:

我有一个scrollView,正在添加和删除自定义视图以响应用户交互。我想确保容器视图总是足够大以显示所有子视图,并且想检测何时添加或删除视图。我尝试使用 KVO:

[self.scrollView addObserver:self forKeyPath:@"subviews" options:NSKeyValueObservingOptionNew context:nil];

但是虽然没有错误,observeValueForKeyPath:... 方法永远不会在子视图数量发生变化时被调用。我应该改用什么?

附:我知道我可以将所需的contentSize 属性的计算直接放入向scrollView 添加/删除子视图的方法中,但是出于架构原因,这个选项不如我,我更喜欢KVO 之类的东西。有这样的选择吗?

【问题讨论】:

    标签: ios objective-c uiview uiscrollview


    【解决方案1】:

    创建 UIView 时“subviews”总是存在的,尝试观察“subviews.count”。或者更好的方法,使用 UIView 中的以下 API:

    - (void)didAddSubview:(UIView *)subview
    

    请参考:“观察视图相关的变化”here

    【讨论】:

    • 无法观察subviews.count,因为NSArray(即subviews)不支持KVO。 :(
    • didAddSubview:willRemoveSubview: 等方法不在委托中,这真是太愚蠢了。它们基本上是硬编码设置为 self 的委托。
    【解决方案2】:

    你不能 KVO 子视图,但你可以 KVO 子层,如果添加子视图也会被调用

    [self.view.layer addObserver:self forKeyPath:@"sublayers" options:NSKeyValueObservingOptionNew context:nil];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多