Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中重写UIView的init方法_Ios_Swift_Uiview_Swift2 - Fatal编程技术网

Ios 在swift中重写UIView的init方法

Ios 在swift中重写UIView的init方法,ios,swift,uiview,swift2,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){

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

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

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

let myView = CustomLoadingView(initialize properties here)
但是,通过此操作,我得到了以下错误:

必须调用超类UIView的指定初始化器

试试这个:

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

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

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

如果您不知道指定的初始值设定项是什么,那么它们就是的初始值设定项,子类在某个时候将调用它们。从文档中:

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

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

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

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")
    }
}
或者,您可以调用类中的其他初始值设定项,最终调用指定的初始值设定项

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

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

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

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

}

如果您想了解更多有关指定和方便初始值设定项的信息,请阅读有关它们的信息。

对于我来说,它调用的是在中的自定义视图初始值设定项中不存在的xib
Bundle.main.loadNibNamed(“xibNameThatDoesTextist”,所有者:self,选项:nil)

`

这只适用于我调用
self.init(frame:frame)
的情况,因为
convency init
方法中的第一件事会产生一个编译器错误:“self”在调用super.init之前使用。在调用super函数之前不能使用self
convenience init() {
    self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE)
}