IBDesignable XIB 由于加载方法而引发错误

Posted

技术标签:

【中文标题】IBDesignable XIB 由于加载方法而引发错误【英文标题】:IBDesignable XIB throws error due to loading method 【发布时间】:2018-05-16 07:37:10 【问题描述】:

这两种情况都会导致代码正确运行,但使用 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

我们将不胜感激。

【问题讨论】:

...sooo 是什么错误? 为什么第一个throw方法会抛出IB渲染错误?为什么投反对票,似乎是一个合法的问题?即使我找到了解决方法。 因为我们不知道错误是什么。你有什么问题? 查看添加的图片。 你试过debug selected views吗? 【参考方案1】:

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

Bundle(for: type(of: self))

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

【讨论】:

在这种情况下,让 'bundle = Bundle(for: myXib.self)' 就足够了吗?谢谢! @Zyntx 如果myXib 是你的班级名称,那么是的。

以上是关于IBDesignable XIB 由于加载方法而引发错误的主要内容,如果未能解决你的问题,请参考以下文章

@IBDesignable 无法使用 Swift 3 呈现类实例并崩溃代理

使用Swift在Xcode 9中不显示IBDesignable UI

如何创建 IBDesignable 自定义视图?

Swift 怎么用xib 自定义View

swift 之xib自定义view可视化到storyboard

使用IBDesignable以编程方式从Assets访问NSImage