从包中加载 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 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
在 Android Studio 中加载 Facebook 登录按钮时出现异常
自定义单元格导致“NSInternalInconsistencyException”,原因:“无法在包中加载 NIB:
MonoTouch <--> 静态库异常:无法在包中加载 NIB
NSInternalInconsistencyException 未捕获的异常“NSInternalInconsistencyException”,原因:“无法在包中加载 NIB:带有名称的 NSBu