Swift中UIViewController的疯狂行为

时间:2014-11-26 14:10:01

标签: ios swift uiviewcontroller initialization

我正在尝试向UIViewController中的Swift添加简单的初始化工具。到目前为止,它一直非常令人沮丧...

首先我尝试将其添加为便利初始化:

class ImageViewController: UIViewController {

    var model: UIImage

    convenience init(model: UIImage){

        self.init(nibName: nil, bundle: nil)
        self.model = model

    }
....

如果我这样做,编译器会强制我实现所需的init(coder aDecoder: NSCoder)。我检查了UIViewController类的定义,并且没有这样的要求,但无论如何。

更糟糕的是,编译器抱怨self.init(nibName: nil, bundle: nil)调用在bundle:中有一个错误的额外参数。同样,我检查了类定义,初始化签名需要两个参数。

所以我决定把它变成一个指定的init。这不是我想要的,因为我不想失去所有超类初始化者。

现在它似乎对self.init(nibName: nil, bundle: nil)电话感到满意,但它仍坚持我实施init(coder aDecoder: NSCoder)

关于发生了什么的任何想法?我不能对此做出正面或反面......

2 个答案:

答案 0 :(得分:3)

错误信息确实令人困惑,但我认为它们来自于这一事实 如果model属性没有默认值,则不再需要所需的初始值设定项 继承自超类。使用可选(或隐式展开的可选)属性 (具有默认值nil)您的代码编译:

class ImageViewController: UIViewController {

    var model: UIImage!

    convenience init(model: UIImage) {
        self.init(nibName: nil, bundle: nil)
        self.model = model
    }
}

答案 1 :(得分:1)

如果您不希望model属性是可选的,请不要将其设为可选。当然,必须实施initWithCoder:是一个婊子,但拥有坚如磐石的安全代码会更好。

class ImageViewController: UIViewController {
    var model: UIImage

    init(model: UIImage) {
        self.model = model
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这可确保创建ImageViewController实例的唯一方法是调用initWithModel:,从而保证model始终具有非可选值。

也许将来,Apple会添加一种方便的方法来做到这一点,但就目前而言,我必须牺牲便利性来控制。