无法呈现ClassName的实例:代理在bundle中引发异常加载nib

Jos*_*ald 17 interface-builder ibdesignable

当我在故事板或其他笔尖中包含我的自定义IBDesignable视图时,代理会崩溃并抛出异常,因为它无法加载笔尖.

错误:IB Designables:无法更新自动布局状态:代理引发了"NSInternalInconsistencyException"异常:无法在bundle中加载NIB:'NSBundle(loaded)',名称为'StripyView'

这是我用来加载笔尖的代码:

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

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

func loadContentViewFromNib() {
    let nib = UINib(nibName: String(StripyView), bundle: nil)
    let views = nib.instantiateWithOwner(self, options: nil)
    if let view = views.last as? UIView {
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在模拟器中运行时,视图正确加载nib,为什么它不会在Interface Builder中显示?

Jos*_*ald 34

当Interface Builder呈现您的IBDesignable视图时,它使用帮助应用程序来加载所有内容.这样做的结果是,mainBundle在设计时与助手应用程序有关,而不是你的应用程序mainBundle.您可以看到错误中提到的路径与您的应用程序无关:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays

加载笔尖时,您依赖于在运行时将bundle: nil默认值传递给应用程序的事实mainBundle.

let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)
Run Code Online (Sandbox Code Playgroud)

所以相反,你需要在这里传递正确的包.使用以下内容修复上述行:

let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)
Run Code Online (Sandbox Code Playgroud)

这将使Interface Builder从与自定义视图类相同的包中加载您的nib.

这适用于您的自定义视图从包中加载的任何内容.例如,本地化的字符串,图像等.如果您在视图中使用这些,请确保使用相同的方法并显式传入自定义视图类的包.

  • 谢谢!令人惊讶的教程中缺少这一点. (4认同)
  • 如果可以,我会给你100分以上.我已经失去了很多时间. (2认同)