【问题标题】:What is called when removing a view from its superview?从父视图中删除视图时调用什么?
【发布时间】:2011-10-15 08:21:57
【问题描述】:

想象一下,我有一个名为 blueView 的视图控制器和另一个名为 greenView 的视图控制器。然后我将greenView.view 添加为blueView.view 的子视图。现在假设在一些用户交互之后,我想从blueView.view 中删除greenView.view 使用:

[self.view removeFromSuperview]

这里实际发生了什么? blueView.view 是否曾经重绘?我认为可能会调用viewDidLoad 方法,但是在将NSLog 消息放入viewDidLoad 之后,在删除子视图后从未调用它。当您从其父视图中删除子视图时,任何关于实际发生的事情的澄清将不胜感激。

【问题讨论】:

  • viewDidLoad 是 UIViewController 方法,而不是 UIView 方法。

标签: objective-c view subview superview


【解决方案1】:

首先,视图控制器旨在一次管理整个视图层次结构;你不应该有两个视图控制器(除了像 UINavigationController 这样的容器控制器)同时处于活动状态。请参阅this SO question and my answer 以更好地理解这一点。所以,你描述的特殊情况不应该出现。 (另外:人们经常混淆视图和视图控制器,因此给视图控制器命名以“-view”结尾是没有帮助的,例如“blueView”。将其称为“blueViewController”有助于避免混淆。)

其次,正如@InsertWittyName 指出的那样,-viewDidLoad 是 UIViewController 方法,而不是 UIView 方法。更进一步,视图控制器和-viewDidLoad 在从视图中添加或删除子视图方面都没有任何作用。 -viewDidLoad 在第一次创建视图控制器的视图时被调用。它基本上只是一种将视图控制器初始化的与视图相关的部分推迟到创建视图层次结构之后的一种方式,因此没有理由仅仅因为从层次结构中删除子视图而再次调用它。

最后,视图如何将自己从其父视图中移除实际上是一个实现细节——它可能在父视图上调用私有 UIView 方法,或者它可能直接修改父视图的子视图列表,或其他。我在文档中没有看到任何明确说明在删除子视图后超级视图将重绘自身的内容,但根据我的经验,超级视图确实会重绘自身。您可以通过在父视图的-drawRect 方法上放置断点来检查这一点。

【讨论】:

  • 我相信你比我知道的更多,如果可以的话,我会删除我自己的答案,所以你的答案可以被接受。 +1
  • 感谢您详细完整的解释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多