如何在 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()
。在这些方法中,您将调用超级版本,然后在您的自定义代码中加载/保存您的额外属性(使用 NSKeyedUnarchiver
和 NSKeyedArchiver
中的方法。)
但是,init(coder:)
和 encode(coder:)
对于您在 IB 中创建的对象并不是很有用,因为 IB 不会为您设置自定义属性。最好只使用简单地调用 super 的 vanilla init(coder:)
,并在代码中配置您的对象,或者使用 IBDesignable 属性,如上所述。
【讨论】:
查看我的编辑。您不能将属性添加到 init(coder:)以上是关于如何在 Swift 1.2 中初始化自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 的自定义类中初始化 Timer? [复制]
如何在 iOS 8/Swift 中构建自定义视图控制器的呈现?变量初始化被证明是困难的
如何将额外的参数传递给自定义UIView类以便在swift中进行初始化