2013-02-27 62 views
4

在文档为loadView,苹果指出:什么叫副作用[超级的loadView]

你的这种方法的自定义实现不应该调用超。

所以我尝试在我的loadView方法中调用[super loadView]。没有什么不好的事情发生,没有任何警告。我正在使用以编程方式创建的视图,在loadView中,不是来自NIB。

当我拨打[super loadView]时会发生什么(如果有)不好的事情?

回答

5

调用[super loadView]将导致运行loadViewUIViewController实现。除此之外,如果已经提供了nibName,则这是从NIB加载视图的方法。因此,如果你要最后调用super,它可能会覆盖你在你自己的子类中所做的所有视图设置。如果你先叫超级,这不会是一个问题......除非你在-awakeFromNib或任何东西有任何代码。

基本上,您不应该调用super,因为如果您以编程方式加载视图,则超类中所做的任何工作都不是您想要保留的工作。充其量,你扔掉了一堆工作。在最坏的情况下,UIViewController可能会在那里设置一些状态,从而对视图的起源做出假设。

你不需要它,所以不要这样做。

+0

如果你想添加额外的子视图到UIViewController中添加的默认视图,那么最好先调用'[super loadView]',以确保超级视图在那里,并且*然后*添加您自己的子视图(假设IB未被使用) – bodacious 2014-08-21 14:30:05

+0

您可以这样做。 'UIViewController'的默认视图只是一个普通的'UIView',所以它不会给你带来很多,但它是可能的。你也可以在'-viewDidLoad'中加入 – 2014-08-21 19:46:57

+0

是的 - 以前我会在viewDidLoad中添加它们,但是现在我开始更喜欢在加载视图中这样做,所以视图更快建立 – bodacious 2014-08-22 08:00:27

1

如果你允许我进行这个比较,就像“不要穿过红色街道。”

有一个红绿灯,用于建立规则过马路,因为它可能任何危险的原因。这是完全合理的,你可能穿过红色的街道,什么也没有发生。

该API设置的是规则,说明你应该不是调用超级。像上面的例子一样,结果是不确定的,取决于其他事情。没有任何反应是完全合理的。