调用[super loadView]是否可行?(问题涉及IT技术)

27

我曾认为不应该调用[super loadView],但某些事情让我感到困惑。

在loadView的说明中(UIViewController Class Reference),它说“你自定义的此方法实现不应该调用super”,但是在ZoomingPDFViewer示例中,他们提供了loadView的实现(ZoomingPDFViewerViewController),其中包括调用[super loadView]。

我尝试从我的loadView方法中调用它,并且它工作得很好,但我只是不明白这意味着不调用super是什么意思。

4个回答

32

绝对不应该调用 [super loadView]。我可以说你在ZoomingPDFViewer示例中发现了一个bug。

当您希望以编程方式创建视图控制器的视图层次结构(而不是使用xib)时,应覆盖loadView方法。

正如您指出的那样,文档明确表示不应调用super。

此方法的自定义实现不应调用super。

我认为这是为了避免从xib和以编程方式创建视图加载两者,因为基类使用此方法从xib加载视图:

如果视图控制器有关联的nib文件,则此方法会从nib文件中加载视图。

还要注意,即使在分配UIViewController对象时,您将nibNameOrNil参数传递nil,UIViewController的loadView实现仍将尝试加载任何包含其关联类名的xib。

如果nibName属性返回非空值,则视图控制器具有关联的nib文件, 这会在以下情况下发生:如果视图控制器是从storyboard实例化的, 如果您使用initWithNibName:bundle:方法显式分配了它的nib文件, 或者如果iOS在app bundle中找到了一个基于视图控制器类名的nib文件。 如果视图控制器没有关联的nib文件,此方法将创建一个普通的UIView对象。

该方法的真正目的是让您完全控制构建视图层次结构,而不依赖于内置的xib加载机制:

您可以重写此方法以手动创建视图。

个人而言,我会覆盖loadView:1.) 如果我为其创建的xib非常简单或2.) 控件布局非常动态,因此使用静态布局创建xib几乎没有好处。


1

NSViewController 尝试在 -loadView 中从 nib 初始化视图。由于控制器没有设置 nib 名称,它将只给出 self.view = nil; 我会认为 UIViewController 的工作方式相同。

因此,这应该是安全的,但完全不必要。


3
尽管它应该是无害的,但如果有一个基于视图控制器名称的xib文件,那么调用[super loadView]将会把那个nib加载到self.view中。我从未真正看到过这种情况发生(因为我从不调用super),但根据文档,这就是我所期望的。此外,我认为调用[super loadView]最少会将一个通用视图分配给self.view,这也是您的代码应该做的事情。再次强调,这不会有任何损害(假设自定义的loadView实现在调用完super后将值分配给self.view),但这是浪费的。 - Sam

0
如果你以编程方式创建ViewController,可以在override func loadView()的开头处调用super.loadView()而不是self.view = UIView(frame: UIScreen.main.bounds)
但是,在super.loadView()之前不要调用self.view,因为如果视图未加载,则会触发后者。
我认为像机器人一样解释苹果的文档并不是一个好主意。

0
如果您在IB中没有创建视图,则应在代码中调用[super loadView]为程序提供视图。
对于自定义视图,您应该使用界面构建器创建视图,因此不需要调用它。

好的,但是“您自定义实现此方法时不应调用super”是什么意思? - Aleksa
1
这意味着您正在创建视图,因此您不需要让其超级加载。 - Antonio MG
1
通过类似以下的方式为您的程序提供视图:UIView *myView = [[[UIView alloc] init] autorelease]; ...(创建视图层次结构)... self.view = myView; 如果您没有将 self.view 分配给新值,那么重写 loadView 的意义是什么? - Sam

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