首页 > 解决方案 > 用 Swift 中的另一个实例替换 UIView 的 self

问题描述

我想xib在 Swift 中以编程方式初始化 -files,所以我创建了类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)
}

标签: iosswiftuiviewxibnib

解决方案


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

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

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

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

用法:

let v = MyView.new()

推荐阅读