在Swift中用另一个实例替换UIView的自身

时间:2018-07-22 10:25:02

标签: ios swift uiview xib nib

我想在Swift中以编程方式初始化xib文件,所以我创建了MyView类。

xib的初始化是在setup()方法中声明的,其中调用了loadNibNamed()。这将返回一个附加视图,我必须将其作为子视图添加到当前/初始视图中。

我在User Interface Inspector中看到MyView后面是初始视图,该视图当然也具有自己的属性。我不喜欢这种行为,也不想两次修改属性。最后,我想实现初始化程序的实例可以替换为通过调用loadNibNamed()创建的实例。比喻self = view

我添加了初始化程序和setup()方法的代码。

required init?(coder aDecoder: NSCoder) {
    NSLog("init with NSCoder")
    super.init(coder: aDecoder)
}

init(in frame: CGRect) {
    NSLog("init with CGRect")
    super.init(frame: frame)
    setup()
}


private func setup() {
    NSLog("setting up")
    let view = Bundle.main.loadNibNamed("MyView", owner: self, options: nil)!.first as! MyView
    addSubview(view)
}

1 个答案:

答案 0 :(得分:0)

您不能在初始化程序中用一个自我代替另一个自我。 init和笔尖加载是相关的,但是这种关系与您的建议相反:从笔尖加载视图将调用您的init(coder:)

您需要的不是初始化程序,而是工厂

给MyView一个 class 方法(class func),客户端可以调用该方法来加载笔尖并返回实例。

class func new() -> MyView {
    let view = Bundle.main.loadNibNamed("MyView", owner: nil, options: nil)!.first as! MyView
    return view
}

用法:

let v = MyView.new()