gpt4 book ai didi

ios - 快速覆盖UIView的init方法

转载 作者:IT王子 更新时间:2023-10-29 05:28:35 26 4
gpt4 key购买 nike

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

}

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

let myView = CustomLoadingView(initialize properties here)

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

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

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

Must call a designated intializer of the superclass UIView

最佳答案

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

如果您不知道什么是指定构造器,它们是必须在某个时候由子类调用的构造器。来自文档:

Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

在这种情况下,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() 的便捷方法,您必须为此添加另一个初始化程序。将此代码添加到您的自定义 View :

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

如果您想了解有关指定初始化器和便利初始化器的更多信息,请阅读它们 herehere .

关于ios - 快速覆盖UIView的init方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com