IBDesignable XIB 由于加载方法而抛出错误

IBDesignable XIB throws error due to loading method

这两种方法都会导致代码正确运行,但使用 loadNibNamed 函数会导致 IB 渲染错误:

Bundle.main.loadNibNamed("myXib", owner: self, options: nil)
self.view.frame = bounds
self.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addSubview(self.view)

IB Designables 出现以下错误:

而使用它在 IB 中正确呈现:

guard let view = loadViewFromNib(name: "myXib") else {return}
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addSubview(view)

func loadViewFromNib(name : String) -> UIView? {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: name, bundle: bundle)
    return nib.instantiate(withOwner: self, options: nil).first as? UIView
}

如有任何见解,我们将不胜感激。

加载 xibs 时不应使用 Bundle.main,因为 IB 不知道您的主要包是什么。您应该始终根据某些 class 的位置找到捆绑包,例如你的第二个例子做了什么:

Bundle(for: type(of: self))

尽管如果您的应用程序中有多个模块,使用所有者的类型也是不安全的。