创建 UIViewController 时什么时候使用 init()?

When to use init() when creating UIViewController?

过去我总是使用 viewDidLoad 来初始化我的 ViewControllers,主要是按照 Apple's 文档的建议对视图执行额外的初始化。然而,有时,我也会 initialiseviewDidLoad 中帮助我完成某项任务的模型对象。这是一个示例代码:

override fun viewDidLoad()
{
    super.viewDidLoad()

    // Initialisation of my views
    self.label.text = "text"
    self.imageView.image = UIImage( named: "image" )
    etc.
    .
    .

    // Initialisation of my models
    self.videoRecorder = VideoRecorder()
    etc.
    .
    .
}

现在想想,把模型初始化放在ViewControllerinit方法里不是更有意义吗?

如果我的问题看起来很明显,我提前道歉,但我发现在我看到的大多数 iOS 教程中,人们往往只在 viewDidLoad 方法中执行 initialisation

非常感谢您的提前帮助。

通常不建议在构造函数中执行任务 (init())。然而,创建一个 ViewController 的 属性 对象可以被认为是一个简单的初始化,因此在 init().

中执行它看起来没问题

应根据您创建的模型的性质及其职责分别考虑每种情况。

经验法则是:执行任务 - 不,初始化属性 - 是

人们通常不这样做的原因是视图控制器通常从故事板和 xib 文件中实例化。在这种情况下,不会调用正常的 init。而是使用 initiWithCoder:,然后相应地设置任何标有 IBOutlet 的属性。

请注意,非常 通常会使初始化属性变得多余,因为它们也倾向于通过 IBOutlet 进行设置。

因此,如果您希望您的视图控制器在与 init 一起使用时也能正常工作,请确保在故事板中使用它时不会遇到麻烦(除非您绝对确定这永远不会发生),您很可能必须同时实施 initinitWithCoder:。我见过很多人 运行 遇到问题,因为他们希望 init 中的 属性 设置在 viewDidLoad 中(从故事板加载控制器时)。

正因为如此,大多数程序员不会理会 init 而依赖 viewDidLoad,因为在某些时候肯定会调用它。编写一个合适的 "both ways usable" 控制器只是更多的代码。

如果您使用从 segue 传入的数据初始化 viewController 变量,那么(根据我个人的经验)在 viewDidLoad 而不是 init 中进行初始化会更好。当我尝试从 init 初始化时,viewController 没有获得从 segue 传入的值。