将 UIView 的自身替换为 Swift 中的另一个实例

Replacing UIView's self with another instance in Swift

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

xib的初始化是在setup()方法中声明的,这里调用了loadNibNamed()。这个 returns 一个额外的视图,我必须将其作为子视图添加到我的 current/initial 视图中。

我在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)
}

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

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

为 MyView 提供一个 class 方法 (class func),客户端可以调用该方法来加载 nib 和 return 实例。

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

用法:

let v = MyView.new()