CustomView 和CustomView.xib有直接关系吗

2024-10-07  本文已影响0人  IMKel

CustomViewCustomView.xib 之间并没有直接的代码关联,它们的关联实际上是通过手动设置 File's Ownerxib 的加载代码来实现的。因此,是否设置 CustomView 作为 CustomView.xibclassFile's Owner,取决于你是否希望通过 CustomView.xibCustomView 类进行交互(例如,连接 IBOutlet 或处理 IBAction)。下面是详细解释:

场景 1:CustomView 是一个自定义视图,并希望加载和显示 CustomView.xib 中的控件
在这个情况下:
File's Owner:应该设置为 CustomView,以便在加载时将 .xib 文件中的控件连接到 CustomView 类的 IBOutlet
class:可以是 CustomView,这样 .xib 文件的顶级视图就是 CustomView 类的实例。

实现步骤:

1.在 xib 文件中,设置 File's OwnerCustomView
2.设置 CustomView.xib 顶级视图的 class 也为 CustomView
3.编写代码加载 CustomView.xib 并将其内容添加到视图中:

class CustomView: UIView {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var imageView: UIImageView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        loadFromNib()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        loadFromNib()
    }

    private func loadFromNib() {
        let nib = UINib(nibName: "CustomView", bundle: nil)
        if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
            view.frame = self.bounds
            addSubview(view)
        }
    }
}

场景 2:CustomView 只是容器,而 .xib 视图是其他类类型(如 UIView
如果 CustomView 是一个简单的视图容器,你不需要将File's Owner 或顶级视图 class 设置为 CustomView。在这种情况下,你可以让 .xib 顶级视图保持为 UIView(或其他),而不必与 CustomView 类强关联。

例如:

这种情况下,加载 xib 时不需要绑定 File's Owner,只需添加顶级视图即可:

class CustomView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        loadFromNib()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        loadFromNib()
    }

    private func loadFromNib() {
        let nib = UINib(nibName: "SomeOtherView", bundle: nil)
        if let view = nib.instantiate(withOwner: nil, options: nil).first as? UIView {
            view.frame = self.bounds
            addSubview(view)
        }
    }
}

总结
File's Owner:必须设置为 CustomView 如果你希望通过 IBOutletIBAction 进行交互。
class:顶级视图的 class 是否为 CustomView 取决于你是否希望 .xib 文件的顶级视图是 CustomView 类的实例。如果不需要特殊的自定义行为,可以保留为 UIView

上一篇 下一篇

猜你喜欢

热点阅读