在swift中覆盖UIView的init方法

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的指定初始化器

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

如果您想了解更多关于指定和便捷初始值设定项的信息,请阅读这里和这里 。

尝试这个:

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

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