【问题标题】:IBDesignable XIB throws error due to loading methodIBDesignable XIB 由于加载方法而引发错误
【发布时间】: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吗?

标签: swift xcode xib ibdesignable


【解决方案1】:

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

Bundle(for: type(of: self))

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

【讨论】:

  • 在这种情况下,让 'bundle = Bundle(for: myXib.self)' 就足够了吗?谢谢!
  • @Zyntx 如果myXib 是你的班级名称,那么是的。
猜你喜欢
  • 2017-10-12
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2022-01-09
  • 2021-07-08
  • 2019-11-10
相关资源
最近更新 更多