从包中加载 NIB 时出现异常

Posted

技术标签:

【中文标题】从包中加载 NIB 时出现异常【英文标题】:Exception when loading NIB from bundle 【发布时间】:2012-01-18 21:56:13 【问题描述】:

当我尝试显示捆绑包中的视图时,我会立即崩溃。这是设置:

项目在应用的主包中包含一个包 CFramework.bundle CFramework.bundle 在其根目录中包含 GigyaFBPreviewController.xib 和它使用的图像 GigyaFBPreviewController.m 位于项目引用的静态库中

代码:

NSString* bundlePath = [[NSBundle mainBundle] pathForResource:@"CBCFramework" ofType:@"bundle"];
NSBundle* bundle = [NSBundle bundleWithPath:bundlePath];
GigyaFBPreviewController* gigya = [[GigyaFBPreviewController alloc] initWithNibName:@"GigyaFBPreviewController" bundle:bundle];
[self presentModalViewController:gigya animated:YES];

代码在单击按钮后执行,并在最后一行崩溃。 GigyaFBPreviewController 只是一个 UIViewController,它使用默认的 initWithNibName:bundle:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Could not load NIB in bundle: 'NSBundle </Users/mjovanovic/Library/Application Support/iPhone Simulator/4.3.2/Applications/A40F8D71-EB88-4EB5-B9D3-CFD330C57F24/socialmediatest.app/CBCFramework.bundle> (not yet loaded)' with name 'GigyaFBPreviewController''
*** Call stack at first throw:
(
    0   CoreFoundation                      0x01ad85a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01c2c313 objc_exception_throw + 44
    2   CoreFoundation                      0x01a90ef8 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x01a90e6a +[NSException raise:format:] + 58
    4   UIKit                               0x00e050fa -[UINib instantiateWithOwner:options:] + 2024
    5   UIKit                               0x00e06ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
    6   UIKit                               0x00cbc628 -[UIViewController _loadViewFromNibNamed:bundle:] + 70
    7   UIKit                               0x00cba134 -[UIViewController loadView] + 120
    8   UIKit                               0x00cba00e -[UIViewController view] + 56
    9   UIKit                               0x00cbba3d -[UIViewController viewControllerForRotation] + 63
    10  UIKit                               0x00cb7988 -[UIViewController _visibleView] + 90
    11  UIKit                               0x00f5993c -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] + 354
    12  UIKit                               0x00c3181e -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 954
    13  UIKit                               0x00eb9619 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 1381
    14  UIKit                               0x00cbe65d -[UIViewController presentModalViewController:withTransition:] + 3478
    15  socialmediatest                     0x000027bb -[socialmediatestViewController clicky:] + 283
    etc

相关信息:

如果我将 nib 文件从 CFramework.bundle 中取出并放入项目中,它可以正常工作。但是,我需要将它打包成一个静态库分发。 bundle 存在于 .app 中,调用 [bundle pathForResource:@"GigyaFBPreviewController" ofType:@"xib"] 返回正确的路径。 如果我从笔尖中删除图像参考,则没有任何变化。所有图片都被引用为 CFramework\image.png “(尚未加载)”错误消息真的很奇怪。我发现很多帖子有人在切换到 Xcode4 时遇到了同样的异常,但他们的解决方案对我不起作用。

* 解决方案 *

xib 没有编译成 nib 并且无法加载,呵呵。感谢 Joshua Weinberg 在 cmets 中提供以下链接!

【问题讨论】:

Using XIB/NIB files contained within downloaded bundles on ios 的可能重复项 (not yet loaded) 不一定是错误消息。这只是意味着您尚未向该捆绑包发送load 消息。 异常描述是什么? 它在设备上运行时如何编译? 解决方法见第一条评论。 【参考方案1】:

首先,如果包没有正确创建,它将不会被加载。因此,为了创建正确的包,以下是创建包的步骤:

    通过在 OS X -> Framework & Libraries 下选择名为 bundle 的模板来添加新目标。

    选择新创建的目标并将 BaseSDK 从 OSX 更改为最新的 iOS。

    在 Build Phrases -> Copy Bundle Resources 中添加您想要使用的 .xibs、图像或其他资源。

    在 Build Phrases 中添加 CoreFoundation 框架 -> 将二进制文件与库链接。

    选择iOS设备编译目标。

    将新创建的捆绑包从 Products 目录保存到某个位置。

现在将该包复制到您的主项目中。使用以下代码加载包:

NSString *path = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:path];

您现在已设置好新捆绑包。

【讨论】:

【参考方案2】:

如果您没有正确设置目标依赖项并且 Xcode 并行化您的构建,您也可能会收到此错误 - 即它将同时构建多个目标。

我在 Project-A 构建子 Project-B 并包含 Project-B-Resources 包时遇到错误。 Project-B 构建了子 Project-C,它构建了自己的 Project-C-Resources。 Project-C 资源捆绑在 Project-B 资源中。在 Xcode > Build Phases > Target Dependencies - 如果我将 Project-B-Resources 放在 Project-B 之上,那么捆绑包将被错误地打包。我需要确保首先列出 Project-B,以确保它正确触发了 Project-C-Resources 构建.....

...有点拗口,让您了解以上内容,但如果您在嵌套项目中遇到缺少 nib 的问题,则需要探索一下

https://developer.apple.com/library/ios/recipes/xcode_help-scheme_editor/Articles/SchemeBuild.html

【讨论】:

以上是关于从包中加载 NIB 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

在 jar 中加载 Web 图像时出现安全异常

在 Android Studio 中加载 Facebook 登录按钮时出现异常

自定义单元格导致“NSInternalInconsistencyException”,原因:“无法在包中加载 NIB:

MonoTouch <--> 静态库异常:无法在包中加载 NIB

NSInternalInconsistencyException 未捕获的异常“NSInternalInconsistencyException”,原因:“无法在包中加载 NIB:带有名称的 NSBu

在 java 中加载 freemarker 模板时出现 FileNotFoundException