iOS检测子视图被添加到UIViewController的视图中

3

我有一个scrollView,根据用户交互添加和移除自定义视图。我希望确保容器视图始终足够大以显示所有子视图,并且想要检测何时添加或删除视图。我尝试使用KVO:

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

但是尽管没有错误,当子视图数量发生变化时,observeValueForKeyPath:... 方法从未被调用。我应该使用什么替代方案?

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

3个回答

3
当创建UIView时,“subviews”始终存在,请尝试观察“subviews.count”。或者更好的方法是使用UIView的以下API:
- (void)didAddSubview:(UIView *)subview

请参考:《观察与视图相关的变化》此处链接

1
无法观察subviews.count,因为NSArray(即subviews)不支持KVO。 :( - SaltyNuts
这些方法didAddSubview:willRemoveSubview:等不是在一个代理中实现简直很愚蠢。它们基本上就是一个代理,只不过硬编码为self而已。 - bcattle

2
您不能使用KVO来观察子视图,但您可以使用KVO来观察子图层,如果添加了子视图,它也将被调用。
[self.view.layer addObserver:self forKeyPath:@"sublayers" options:NSKeyValueObservingOptionNew context:nil];

0
由于某些原因,当我尝试在Swift中使用addObserver(forKeyPath:options:context:)时,我一直收到以下错误:

An -observeValueForKeyPath:ofObject:change:context: message was received but not handled

所以最终我使用了Swift特定的KVO API:
token = view.layer.observe(\.sublayers, options: [.old, .new]) { _, change in
    print("Observed: \(change)")
}


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