使用 loadNibNamed 加载视图时,如何在 UIView 上调用便利初始化程序?

Posted

技术标签:

【中文标题】使用 loadNibNamed 加载视图时,如何在 UIView 上调用便利初始化程序?【英文标题】:How to invoke a Convenience Initialiser on UIView when a view is loaded using loadNibNamed ? 【发布时间】:2017-03-18 08:30:53 【问题描述】:

如何调用从 .xib 文件加载的视图的便捷初始化程序? 我的初始化程序定义如下:

class CustomView : UIView
    var prop1:Int
    var prop2:Int
    convenience init(prop1:Int, prop2:Int, frame:CGRect)
        self.prop1 = prop1
        self.prop2 = prop2
        super.init(frame:frame)
    

现在,如果我想像这样从关联的 .xib 文件中实例化 customView,如何执行此初始化程序

Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)?.first as! CustomView

谢谢。

【问题讨论】:

当你从 xib 加载然后你调用init?(coder aDecoder: NSCoder) 简答;你不能。在创建视图后设置属性或在 nib 中指定它们并按照 Adrian 的建议使用 init(coder) 【参考方案1】:

正如@Paulw 所说,你不能。从 xib/storyboard 加载的视图总是用init(coder:) 初始化。 UIView reference 声明:

nib 文件中的对象被重构,然后使用初始化 他们的 init(coder:​) 方法,它修改了视图的属性 匹配存储在 nib 文件中的属性。

如果您想在 Interface Builder 中设置自定义视图,并且您有想要设置的自定义属性,您可以将这些属性设置为 IBInspectable

class CustomView: UIView 

    @IBInspectable var prop1: Int
    @IBInspectable var prop2: Int


然后,当您在 Interface Builder 中选择该视图时,您将在 Attributes 检查器中看到它们(确保首先在 Identity 检查器中将 Class 设置为您的类的名称)。

NSHipster 在 IBInspectable here 上有一篇很棒的文章。

【讨论】:

以上是关于使用 loadNibNamed 加载视图时,如何在 UIView 上调用便利初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用方法[NSBundle loadNibNamed:xibName owner:[NSApplication sharedApplication]]加载Nib时如何传递参数?

关闭使用 loadNibNamed 加载的 NIB

通过 loadNibNamed() 从 xib 加载按钮从未调用

如何在 ios 中使用 UI NIB 而不是 loadNibNamed 来自定义 UI 表格视图单元格?

使用 loadNibNamed: 方法时是不是需要释放 IBOutlets?

如何在加载了 nib 文件的 UIView 中调整子视图的大小