Swift 子类化UIView
我试图使用自定义初始值设定项对UIView进行子类化,但遇到了多个错误Swift 子类化UIView,swift,class,uiview,subclass,init,Swift,Class,Uiview,Subclass,Init,我试图使用自定义初始值设定项对UIView进行子类化,但遇到了多个错误 class ProgressAlertView: UIView { var title: String override init(frame: CGRect) { super.init(frame: frame) alertLayout() } required init?(coder aDecoder: NSCoder) { super
class ProgressAlertView: UIView {
var title: String
override init(frame: CGRect) {
super.init(frame: frame)
alertLayout()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
alertLayout()
}
convenience init(title: String) {
self.title = title
self.init(title: title)
}
}
上面的代码将导致多条错误消息,其中包括便利init中我的变量title的错误消息:“self”用于“self.init”调用之前的属性访问“title”
然而,Swift要求在一个初始化其他实例变量之后,必须调用超类中的所有初始化器。所以错误一定在别的地方
非常感谢这里的提示。想想你希望在
override init(frame: CGRect) {
super.init(frame: frame)
alertLayout()
}
及
您有一个非可选的实例变量title
。在这两种情况下,它应该如何得到一个值
在你的第三个init
convenience init(title: String) {
self.title = title
self.init(title: title)
}
init(title:String)
调用init(title:String)
,然后调用init(title:String)
,等等。您处于无限递归区域
如果您想在代码中实例化视图,您将需要类似于
init(title: String, frame: CGRect) {
self.title = title
super.init(frame: frame)
alertLayout()
}
您还需要实现
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
如果你在故事板/笔尖中使用这个,那么你需要
required init?(coder aDecoder: NSCoder) {
self.title = ""
super.init(coder: aDecoder)
}
然后给
title
赋值,然后init(title:String)
调用自己!这不是它应该做的吗?介意详细说明吗?这将导致递归-init调用自身,后者依次调用自身,后者依次…等等,您应该重写didMoveToSuperview方法以自定义视图如果您给title
一个默认值,例如var title=“”,您可以保留init(title:)
初始值设定项以方便使用
。这就是我要找的。子类化时初始值设定项的语法对我来说不是很直观,所以这非常有用。谢谢
required init?(coder aDecoder: NSCoder) {
self.title = ""
super.init(coder: aDecoder)
}