swift2 在swift中覆盖UIView的init方法

disho6za  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(205)
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的指定初始化程序

eh57zj3b

eh57zj3b1#

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

如果你想了解更多关于指定初始化器和便利初始化器的信息,请阅读here和这里。

rekjcdws

rekjcdws2#

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

epggiuax

epggiuax3#

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

fkaflof6

fkaflof64#

试试看:

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")
    }
}

相关问题