1

我边走边学 Swift。

我发现这样的函数viewDidLoad()和许多其他函数有时是这样写的:

override func viewDidLoad() {
  super.viewDidLoad()
  // Do any additional setup after loading the view, typically from a nib.
}

有时这样写:

override func viewDidLoad() {
  // Do any additional setup after loading the view, typically from a nib.
  super.viewDidLoad()
}

我的意思是打电话给super.viewDidLoad()作为函数内部的第一件事还是最后一件事?

它对程序本身有什么影响?

4

2 回答 2

2

首先,文档没有说您需要调用super. 将其与 eg 进行对比viewWillAppear(_:),其文档指出:

如果您覆盖此方法,则必须super在您的实现中的某个时间点调用。

因此,super只有当您有一个自定义子类时才需要调用UIViewController,让我们调用它BaseViewController,它在viewDidLoad().

当你再继承自时BaseViewController,你可能需要调用super来做BaseViewController. 根据它的性质,您需要在子类的开头、中间某处或结尾处执行此操作viewDidLoad()。这取决于BaseViewController正确记录它。

这是一个人为的例子:

class ColorfulViewController: UIViewController {
    /// Defines background color of view. Override in subclass.
    var shinyColor: UIColor = .red

    /// Sets the background color. Make sure to call `super` in subclass.
    func viewDidLoad() {
        backgroundColor = shinyColor
    }
}

class PinkViewController: ColorfulViewController {
    override var shinyColor: UIColor = .systemPink

    func viewDidLoad() {
        super.viewDidLoad() // This one doesn't matter where it goes.
        // Additional work.
    }
}

另一个你想super在最后调用的人为示例:

class CountingViewController: UIViewController {
    var count: Int = 0

    /// Counts the subviews. When subclassing, make sure to call `super` *after*
    /// view is fully configured.
    func viewDidLoad() {
        count = view.subviews.count
    }
}

class FooViewController: CountingViewController {
    override var shinyColor: UIColor = .systemPink

    func viewDidLoad() {
        // Additional work.
        super.viewDidLoad()
    }
}
于 2019-12-22T19:52:37.657 回答
0

这取决于。通常viewDidLoad()你会把 super 调用放在方法的开头,因为没有真正的理由不这样做。

您必须了解super调用的概念才能更好地理解它。
super.someFunction()调用超类的函数。在我们的例子中,你的自定义 View Controller 的类,比如说MyViewControlleris UIViewController,它viewDidLoad()是最初定义的地方。在这种情况下,您覆盖该方法,您应该调用该super调用以确保没有留下任何东西。请注意,viewDidLoad()具体而言,从 调用 super 不是强制性的UIViewController,尽管建议将其作为防御性调用。通常文档会提到它是否需要。

如果您有另一个自定义视图控制器,假设是MySecondViewControllerfrom 的子类MyViewController,并且您想在viewDidLoad()fromMyViewController发生之前执行一些操作,您可以将super.viewDidLoad()ofMySecondViewController放置在函数的末尾或您想要的位置,如下所示:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        doSomething()
    }
}

class MySecondViewController: MyViewController {

    override func viewDidLoad() {
        // Do something else before doSomething() is called by the superclass
        doSomethingElse()
        super.viewDidLoad()
    }
}
于 2019-12-22T19:59:26.630 回答