如何在Swift 1.2中初始化自定义UIView

时间:2015-05-31 22:01:58

标签: ios uiview

我希望以编程方式初始化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(编码器:)。

我该怎么做?无论采取哪种方法,似乎都存在各种错误的无休止循环。

1 个答案:

答案 0 :(得分:0)

覆盖initWithFrame并调用super.init(frame:)

我在评论中错过了。您还需要实现init(编码器:)在该方法中,您将无法提供您的id参数,并且需要将其设置在其他位置。您可以考虑将您的id属性设置为IBInspectable并将其设置为IB。

init(coder:)方法旨在为自定义子类保存所需的任何属性。您要做的是覆盖init(coder:)encodeWithCoder()。在这些方法中,您将调用超级版本,然后在自定义代码中加载/保存您的额外属性(使用NSKeyedUnarchiverNSKeyedArchiver中的方法。)

但是,init(coder:)encode(coder:)对您在IB中创建的对象不是很有用,因为IB不会为您设置自定义属性。最好只使用简单调用super的vanilla init(coder:),并在代码中配置对象,或者使用IBDesignable属性,如上所述。