为什么/什么时候我们必须调用super.ViewDidLoad?

And*_*s4n 47 ios swift

每个人都告诉我"使用super.viewDidLoad(),因为它就像那样"或"我一直都这样做,所以保持","如果你不称之为",那就错了"等等.

override func viewDidLoad() {
    super.viewDidLoad()
    // other stuff goes here
}
Run Code Online (Sandbox Code Playgroud)

我只发现了一些关于Objective-C案例的话题并且它们并不那么具有启发性,但我正在开发Swift 3,那么任何专家都可以给我一个很好的详细解释吗?

这是一个好的做法还是有任何隐藏的影响?

tsp*_*tsp 35

通常,对于没有返回值的所有覆盖函数调用super是个好主意.

你不知道实施的viewDidLoad.UIViewController可以在那里做一些重要的设置工作而不调用它不会让它有机会运行它自己的viewDidLoad代码.

从UIViewController子类继承时也是如此.

即使打电话super.viewDidLoad没有做任何事情,总是打电话给它是一个很好的习惯.如果你养成不打电话的习惯,你可能会忘记在需要时给它打电话.例如,当从第三方框架或您自己的代码库继承依赖于它的ViewController时.

拿这个人为的例子:

class PrintingViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view has loaded")
    }
}

class UserViewController: PrintingViewController {
    override func viewDidLoad() {
    super.viewDidLoad()

     // do view setup here
    }

}
Run Code Online (Sandbox Code Playgroud)

不在这里调用viewDidLoad永远不会PrintingViewController有机会运行自己的viewDidLoad代码

如果你不想做任何事情viewDidLoad就不要实现它.无论如何都会调用super方法.

  • 另外,假设你有一些继承自UIViewController的视图控制器,并且没有为viewDidLoad调用super.几个月后,你决定要从一些不同的ViewController继承,它在viewDidLoad中做了一些事情.你的代码会以神秘的方式破解.我们不打电话给super,所以我们不要忘记在需要时调用它,我们称之为保护我们的代码以防万一. (5认同)
  • 你的解释以一种通用的方式使它更加清晰(谢谢你!).但是我希望在这种情况下更深入地了解UIViewController.做到这一点,我不会忘记多做几次听起来像一个传统:很久以前有人开始,现在没有人知道我们为什么继续这样做,但我们仍然这样做.检查标准UIVIewController上的viewDidLoad ......它是空的.现在,我们为什么要调用一个空的超级方法?或者我在这里做出错误的假设?如果我决定实现我的自定义viewDidLoad并且不调用super,我的应用程序(任何)是否会表现错误? (3认同)
  • 不确定时检查文档。例如,您不应该在 loadView() 中调用 super: https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview 。一般来说,期望开发人员会调用 super 除非被告知不要这样做,而不是相反,所以这是进入的正确心态。 (2认同)

mxc*_*xcl 10

我有一个秘密,在苹果公司工作时,我阅读了UIKit的源代码,部分回答了我这样的问题,viewDidLoad在所有UI * ViewController类中都是空的。

我自然不在了,他们可能已经改变了这一点。


gio*_*shc 6

取决于实施viewDidLoad中的类UIViewController(从其中所有视图控制器继承).如果它是空的比呼叫super.viewDidLoad()不会做太多.但是,如果它有一些关于视图控制器的功能,那么你肯定会想要使用它.

由于关于a的实现并不在你手中,所以UIViewController你应该总是调用这个方法


Vit*_*pov 5

我认为调用super.viewDidLoad()首先是一个很好的做法.

iOS中通常的做法是在超类完成它需要完成的设置(初始化属性,放置等等)之后,完成所有子类设置.如果在开始更改内容之前没有给超类提供处理其所有设置的机会,那么您可能会遇到一些奇怪的错误和行为.

我们可以使用类初始化绘制并行:"在为继承的属性赋值之前,指定的初始化程序必须委托一个超类初始化程序." 我们这样做是为了确保所有超类属性都有一个值,基于这一事实我们可以通过子类中的继承安全地使用它们.

经验法则:

  • 初始化/设置时,首先运行超类的实现.
  • 拆除/清理时,最后运行超类的实现.

假设viewDidLoad()是某种初始化,我们应首先调用super.viewDidLoad()来正确设置超类中的内容.

如果我们在U​​IViewController基类中检查viewDidLoad()的实现,我们可以看到它是空的.所以也许从你的子类调用super.viewDidLoad()的唯一原因是一个很好的编码风格:-)让我们遵循它!