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

时间:2016-02-29 12:58:04

标签: interface-builder ibdesignable

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

  

错误:IB Designables:无法更新自动布局状态:代理引发了一个" NSInternalInconsistencyException"例外:无法在捆绑中加载NIB:' NSBundle(已加载)'名字' 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)
    }
}

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

2 个答案:

答案 0 :(得分: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)

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

let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)

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

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

答案 1 :(得分:3)

与" Josh Heald"相同的观点,我们无法通过nil for bundle。和 这个对象是谁 - C:

Sub Test()
    Dim fRng As Range ' the cell that has the formula
    Set fRng = Worksheets("sheet1").Range("A1")
    Dim tWS As Worksheet 'the worksheet that has the values you want to get
    Set tWS = Worksheets("sheet2")
    Dim r As Range
    For Each r In Range(fRng.Formula).Rows
     'Debug.Print r.Row ' this is the rows numbers
     Debug.Print tWS.Cells(r.Row, "N").Value 'N is the column name
    Next
End Sub