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



当我在情节提要或其他笔尖中包含自定义 IBDesignable 视图时,代理崩溃并引发异常,因为它无法加载笔尖。

错误: IB 可设计对象: 无法更新自动布局状态: 代理引发"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)
    }
}

当我在模拟器中运行时,视图从笔尖正确加载,为什么它不会显示在界面生成器中?

当界面生成器呈现您的IBDesignable视图时,它会使用帮助程序应用程序来加载所有内容。这样做的结果是,设计时的mainBundle与帮助程序应用相关,而不是应用的mainBundle。您可以看到错误中提到的路径与您的应用无关:

/Applications/Xcode.app/Content/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)

这将使界面生成器从与自定义视图类相同的捆绑包中加载笔尖。

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

与"Josh Heald"的观点相同,我们不能为捆绑传递 nil。和这个为谁在对象 - C:

- (UIView *) loadViewFromNib{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0];
return v;
}

相关内容

  • 没有找到相关文章

最新更新