从超级视图中删除视图时调用的是什么?

时间:2011-07-28 17:39:42

标签: objective-c view subview superview

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

[self.view removeFromSuperview]

这里到底发生了什么? blueView.view是否曾重新绘制过?我认为可能会调用viewDidLoad方法,但是在NSLog中放入viewDidLoad消息后,在删除子视图后从未调用过它。当你从超级浏览中删除子视图时,对于实际发生的事情的任何澄清将不胜感激。

1 个答案:

答案 0 :(得分:4)

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

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

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