如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的自定义类中初始化 Timer? [复制]

如何在 iOS 8/Swift 中构建自定义视图控制器的呈现?变量初始化被证明是困难的

如何将额外的参数传递给自定义UIView类以便在swift中进行初始化

FacebookSDK(4.1.x) 自定义登录 UI 按钮 - Swift(1.2)

Swift 和 Xcode - 如何创建自定义标签栏图标

在 Swift 中链接 Promise 以初始化自定义对象