从bundle加载NIB时出现异常

时间:2012-01-18 21:56:13

标签: ios xcode4.2 bundle nib ios5

一旦我尝试从捆绑中显示视图,我就会崩溃。这是设置:

  • Project在应用程序的主要包中包含一个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

相关信息:

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

*解决方案 *

xib没有被编译成笔尖而且无法加载,呃。感谢Joshua Weinberg在评论中提供以下链接!

2 个答案:

答案 0 :(得分:2)

首先,如果未正确创建捆绑包,则不会加载。因此,为了创建一个合适的包,下面是创建包的步骤:

  1. 通过在OS X下选择名为bundle的模板添加新目标 - &gt;框架&amp;库。

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

  3. 在Build Phrases中添加要从捆绑中使用它的.xibs,图像或其他资源 - &gt;复制捆绑资源。

  4. 在Build Phrases中添加CoreFoundation框架 - &gt;链接二进制文件与库。

  5. 选择iOS设备编译目标。

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

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

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

    现在您已使用新捆绑包进行设置。

答案 1 :(得分:0)

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

我有一个错误,其中Project-A构建了子Project-B并包含了Project-B-Resources包。 Project-B构建了子Project-C,它构建了自己的Project-C-Resources。 Project-C资源捆绑在Project-B资源中。在Xcode中&gt;构建阶段&gt;目标依赖项 - 如果我将Project-B-Resources放在Project-B之上,那么捆绑包将被错误地打包。我需要确保首先列出Project-B,以确保它正确地触发Project-C-Resources构建.....

......有点满口,并且让你的头围绕着上面,但是如果你在嵌套项目中遇到缺少的笔尖问题,这是值得探索的东西

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