何时在创建UIViewController时使用init()?

时间:2016-10-05 10:18:29

标签: ios swift uiviewcontroller initialization viewdidload

在过去,我总是使用viewDidLoad来初始化我的ViewControllers,主要是为Apple's文档建议的视图执行其他初始化。但有时候,我initialise还会在viewDidLoad中模拟帮助我完成某项任务的对象。这是一个示例代码:

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.
    .
    .
}

当我现在考虑它时,将模型初始化放在init的{​​{1}}方法中是否更有意义?

如果我的问题显而易见,我会事先道歉,但我发现在我看过的大多数ViewController教程中,人们往往只在iOS方法中执行initialisation

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

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

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

由于这一切,大多数程序员都不关心init并依赖viewDidLoad,因为这在某些时候肯定会被调用。编写一个合适的“双向可用”控制器只是更多的代码。

答案 1 :(得分:0)

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

每个案例都应根据您创建的模型的性质及其职责单独考虑。

拇指规则是:执行任务 - 否,初始化属性 - 是

答案 2 :(得分:0)

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