我想在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)
}
答案 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()