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.
这适用于您的自定义视图从包中加载的任何内容.例如,本地化的字符串,图像等.如果您在视图中使用这些,请确保使用相同的方法并显式传入自定义视图类的包.
| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |