我希望以编程方式初始化UIView
子类,例如,应该使用Int启动。我想做这样的事情:
class OneFingerView: UIView
{
let id: Int
init(id: Int)
{
self.id = id
super.init()
}
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
}
但是收到错误
必须调用超类UIView的指定初始值设定项
我之前的尝试如下:
class OneFingerView: UIView
{
let id: Int
var delegate: OneFingerViewProtocol? = nil
init(id: Int, frame: CGRect)
{
self.id = id
super.init(frame: frame)
}
override init(frame: CGRect)
{
super.init(frame: frame)
}
}
但是后来我得到一个错误,我没有实现init(编码器:)。
我该怎么做?无论采取哪种方法,似乎都存在各种错误的无休止循环。
答案 0 :(得分:0)
覆盖initWithFrame并调用super.init(frame:)
我在评论中错过了。您还需要实现init(编码器:)在该方法中,您将无法提供您的id参数,并且需要将其设置在其他位置。您可以考虑将您的id属性设置为IBInspectable并将其设置为IB。
init(coder:)
方法旨在为自定义子类保存所需的任何属性。您要做的是覆盖init(coder:)
和encodeWithCoder()
。在这些方法中,您将调用超级版本,然后在自定义代码中加载/保存您的额外属性(使用NSKeyedUnarchiver
和NSKeyedArchiver
中的方法。)
但是,init(coder:)
和encode(coder:)
对您在IB中创建的对象不是很有用,因为IB不会为您设置自定义属性。最好只使用简单调用super的vanilla init(coder:)
,并在代码中配置对象,或者使用IBDesignable属性,如上所述。