Swift 子类化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

我试图使用自定义初始值设定项对UIView进行子类化,但遇到了多个错误

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