在swift中覆盖UIView的init方法

时间:2016-02-19 03:48:55

标签: ios swift uiview swift2

class CustomView: UIView {

    var subViewColor:UIColor
    var subViewMessage:String

    override init(frame:CGRect) {
        super.init(frame:frame)
    }

    init(subViewColor:UIColor,subViewMessage:String){

        self.subViewColor = subViewColor
        self.subViewMessage = subViewMessage
        super.init()

    }

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

}

我有一个类,我希望用户通过提供以下属性来初始化自定义视图:

let myView = CustomLoadingView(initialize properties here)

如果用户不想初始化自己的属性,我想使用默认属性初始化CustomLoadingView ...

let myView = CustomLoadingView() // this should initialize using default value

但是,有了这个,我收到了这个错误:

  

必须调用超类UIView

的指定初个化程序

4 个答案:

答案 0 :(得分:30)

init(subviewColor: UIColor, subViewMessage: String)中,您没有调用指定的初始值设定项(正如编译器指出的那样)。

如果你不知道指定的初始化器是什么,它们是初始化器,在某个时候由子类调用。来自文档:

  

指定的初始值设定项是类的主要初始值设定项。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续超类链的初始化过程。

在这种情况下,UIView的指定初始化程序为init(frame: CGRect),这意味着您的新初始化程序init(subviewColor: UIColor, subViewMessage: String必须在某个时候调用super.init(frame:)

要解决此问题,请进行以下更改:

init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){

    self.subViewColor = subViewColor
    self.subViewMessage = subViewMessage
    super.init(frame: frame)

}

或者您可以在班级中调用其他初始化程序,最终调用指定的初始化程序。

override init(frame: CGRect) {
    super.init(frame: frame) // calls designated initializer
}

convenience init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){

    self.subViewColor = subViewColor
    self.subViewMessage = subViewMessage
    self.init(frame: frame) // calls the initializer above

}

对于简单CustomLoadingView()的便捷方法,您必须为此添加另一个初始值设定项。将此代码添加到自定义视图中:

convenience init() {
    self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE)
}

如果您想了解有关指定和便利初始值设定项的详情,请阅读herehere

答案 1 :(得分:1)

试试这个:

class CustomView: UIView {

    var subViewColor:UIColor
    var subViewMessage:String

    init(subViewColor:UIColor,subViewMessage:String){

        self.subViewColor = subViewColor
        self.subViewMessage = subViewMessage

        let frame = self.frame
        //Or you can use custom frame. 

        super.init(frame: frame)

    }

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

答案 2 :(得分:0)

您必须在自定义初始值设定项中的某个位置调用UIView指定的初始值设定项之一,例如:super.init(frame: frameX)。您对super.init()的致电不符合此要求。

答案 3 :(得分:0)

对不起,它正在调用自定义视图初始化程序中不存在的xib Bundle.main.loadNibNamed("XibNameThatDoesntExist", owner: self, options: nil) `