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

时间:2016-10-20 10:22:20

标签: ios swift

每个人都告诉我&#34;使用super.viewDidLoad(),因为它就像那样&#34;或者&#34;我一直这样做,所以请保持&#34;,&#34;如果你不打电话给超级&#34;等等,那就错了。< / p>

override func viewDidLoad() {
    super.viewDidLoad()
    // other stuff goes here
}

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

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

6 个答案:

答案 0 :(得分:33)

通常最好为你覆盖的所有没有返回值的函数调用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
    }

}

此处不调用viewDidLoad永远不会让PrintingViewController有机会运行自己的viewDidLoad代码

如果您不想在viewDidLoad中执行任何操作,请不要实现它。无论如何都会调用super方法。

答案 1 :(得分:6)

这取决于类viewDidLoadUIViewController的实现(所有视图控制器都从中继承)。如果它是空的而不是调用super.viewDidLoad()将不会做太多。但是,如果它有一些关于视图控制器的功能,那么你肯定会想要使用它。

由于关于UIViewController的实施不在您手中,您应该始终使用此方法

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

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

iOS中通常的做法是在超类完成需要执行的设置(初始化属性,布局等)之后执行所有子类设置。如果你在开始改变事物之前没有让超类有机会处理它的所有设置,那么你可能会遇到一些奇怪的错误和行为。

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

经验法则

  • 初始化/设置时,运行超类&#39;先实现。
  • 拆除/清理时,请运行超级班级&#39;最后实施。

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

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

答案 4 :(得分:0)

直接从UIViewController继承时,在文档说明中调用super

例如,viewWillAppear(Bool)说,“如果重写此方法,则必须在实现的某个时刻调用super”,而viewDidLoad()则不需要。

如果您不是直接从UIViewController继承,并且您继承的类没有可靠的文档,或者可能默默地引入重大变化,要求调用super,请始终调用{{ 1}}。

答案 5 :(得分:0)

如果你的类是直接从 UIViewController 继承的,那么就不需要调用 super.viewDidLoad。这肯定会让你的代码看起来有点简洁,但通常 iOS 社区建议无论如何调用它。

如果你的类是从自定义 UIViewController 继承的,它确实有一些你的类可以利用的功能,然后调用 super.viewDidLoad。