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))
尽管如果您的应用程序中有多个模块,使用所有者的类型也是不安全的。
这两种方法都会导致代码正确运行,但使用 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))
尽管如果您的应用程序中有多个模块,使用所有者的类型也是不安全的。