一尘不染

如何在Swift中为UIViewController子类创建自定义初始化程序?

swift

道歉,如果以前已经问过这个问题,我已经搜索了很多,并且许多答案都来自早期Swift的Beta版本,当时情况有所不同。我似乎找不到确切的答案。

我想创建一个子类,UIViewController并有一个自定义的初始化程序,使我可以轻松地在代码中进行设置。我在Swift中无法执行此操作。

我想要一个init()可以用来传递特定参数的函数,NSURL然后将其与视图控制器一起使用。在我看来,它看起来像init(withImageURL: NSURL)。如果我添加了该功能,则要求我添加该init(coder: NSCoder)功能。

我相信这是因为它在超类中用required关键字标记了吗?所以我必须在子类中这样做吗?我添加:

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

怎么办?我的特殊初始化程序被认为是convenience一个吗?指定一个?我叫超级初始化器吗?来自同一类的初始值设定项?

如何将特殊的初始化方法添加到UIViewController子类上?


阅读 253

收藏
2020-07-07

共1个答案

一尘不染

class ViewController: UIViewController {

    var imageURL: NSURL?

    // this is a convenient way to create this view controller without a imageURL
    convenience init() {
        self.init(imageURL: nil)
    }

    init(imageURL: NSURL?) {
        self.imageURL = imageURL
        super.init(nibName: nil, bundle: nil)
    }

    // if this view controller is loaded from a storyboard, imageURL will be nil

    /* Xcode 6
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    */

    // Xcode 7 & 8
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
2020-07-07