关于viewcontroller的初始化(swift)

时间:2017-02-02 10:05:50

标签: ios swift swift3 initialization

我有一个名为TwoViewController.swift的ViewController文件和一个名为TwoViewController.xib的nib文件。

TwoViewController.swift喜欢这个↓

class TwoViewController: UIViewController {
    var pageTitle: String?

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

然后,我会新建一个TwoViewController并将其呈现在OneViewController.swift这样的↓

class OneViewController: UIViewController {

    ・・・・・・
    override func viewDidLoad() {
       super.viewDidLoad()
    }
    ・・・・・・
    func presentTwo() {
       let two = new TwoViewController()
       two.pageTitle = "2222"
       self.present(two, animated: false, completion: nil)
    }
}

但是,我希望new TwoViewController并同时将值设置为属性pageTitlenew TwoViewController(pageTitle: "22222")

要做到这一点,我想我需要在TwoViewController上创建一个init方法。 我尝试制作如下↓的初始化方法。它是否正确?

class TwoViewController: UIViewController {
    var pageTitle: String

    init(pageTitle: String) {
       super.init(nibName: nil, bundle: nil)
       self.pageTitle = pageTitle
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

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

2 个答案:

答案 0 :(得分:2)

你可以这样做,但是你必须在每个初始化程序中用一些默认值初始化pageTitle,这通常是你不知道的。

因此,这并不常见。而是在初始化后分配属性值,就像您最初一样(在funcTwo中),并继续viewDidLoad中的处理:

class TwoViewController: UIViewController {
    var pageTitle: String!

    override func viewDidLoad() {
        // use pageTitle to fill some outlet or so:
        self.title = pageTitle
    }
}

或使pageTitle成为可选项,并在viewDidLoad中设置,如果已设置,则会签入。

顺便说一下:如果您遵循命名方案并将您的XIB文件命名为视图控制器,则可以使用隐式格式:

let twoController = TwoViewController.init()

或明确

    let twoController = TwoViewController.init(nibName: "TwoViewController", bundle: nil)

答案 1 :(得分:0)

你应该从你的nib文件中初始化你的TwoViewController,如下所示:

let twoController = TwoViewController.init(nibName: "TwoViewController", bundle: nil)

然后你可以像这样初始化你的pageTitle:

twoController.pageTitle = "2222"

然后你可以像这样展示你的twoViewController:

self.present(twoController, animated: false, completion: nil)