【问题标题】:Failed to render instance of ClassName: The agent threw an exception loading nib in bundle无法呈现 ClassName 的实例:代理在 bundle 中加载 nib 时抛出异常
【发布时间】:2023-04-07 07:13:01
【问题描述】:

当我在故事板或其他 nib 中包含自定义 IBDesignable 视图时,代理崩溃并引发异常,因为它无法加载 nib。

错误: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)
    }
}

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

【问题讨论】:

    标签: interface-builder ibdesignable


    【解决方案1】:

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

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

    加载 nib 时,您依赖于在运行时传递 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。

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

    【讨论】:

    • 谢谢!数量惊人的教程都缺少这一点。
    • 如果可以的话,我会给你 100+ 分。我为此浪费了很多时间。
    • 很高兴能帮上忙,劳拉和乔!
    • 我遇到了类似的问题。如果此解决方案不起作用,请在此处尝试我的答案(删除任何孤立的 IBOutlets)。 stackoverflow.com/a/48388116/6804257
    【解决方案2】:

    与“Josh Heald”的观点相同,我们不能将 nil 传递给 bundle。和 这是对象中的谁 - 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;
    }
    

    【讨论】:

    • 这大约有 1 年的历史,对我来说并不是完整的解决方案,但这让我克服了加载笔尖的主要障碍。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2015-06-03
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多