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

Posted

技术标签:

【中文标题】如何在 Swift 1.2 中初始化自定义 UIView【英文标题】:How to init custom UIView in Swift 1.2 【发布时间】:2015-05-31 22:01:57 【问题描述】:

我希望以编程方式初始化一个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(coder:) 的错误。

我该怎么做?无论我采取哪种方法,似乎都会出现各种错误的无限循环。

【问题讨论】:

您是否查看过这个问题:***.com/q/28553364/558933。基本上init() 不是UIView 的指定初始化器。 谢谢,我确实使用了 init(frame:),这在调用 super.init(coder:) 时会导致我出现新错误。上面的例子是我想做的,我正在寻找类似的东西。 init(frame:) 的代码应该调用 super.init(frame:),而不是 init(coder:) 【参考方案1】:

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

我在评论中说错了。您还需要实现 init(coder:) 在该方法中您将无法提供您的 id 参数,并且需要在其他地方设置它。您可能会考虑将您的 id 属性设置为 IBInspectable 并将其设置在 IB 中。

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

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

【讨论】:

查看我的编辑。您不能将属性添加到 init(coder:)

以上是关于如何在 Swift 1.2 中初始化自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章