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")
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个类,我希望用户通过提供以下属性来初始化自定义视图:
let myView = CustomLoadingView(initialize properties here)
Run Code Online (Sandbox Code Playgroud)
如果用户不想初始化自己的属性,我想CustomLoadingView使用默认属性进行初始化...
let myView = CustomLoadingView() // this should initialize using default value
Run Code Online (Sandbox Code Playgroud)
但是,有了这个,我收到了这个错误:
必须调用超类UIView的指定初始化程序
tkt*_*ota 35
在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)
}
Run Code Online (Sandbox Code Playgroud)
或者您可以在班级中调用其他初始化程序,最终调用指定的初始化程序.
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
}
Run Code Online (Sandbox Code Playgroud)
至于简单的方便方法CustomLoadingView(),你必须为此添加另一个初始化程序.将此代码添加到自定义视图中:
convenience init() {
self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE)
}
Run Code Online (Sandbox Code Playgroud)
如果您想了解有关指定和便利初始化程序的更多信息,请在此处和此处阅读.