"NSInternalInconsistencyException"未捕获的异常,原因是“无法在Bundle中加载NIB:名称为NSBundle”。

3
我在我的iOS应用中遇到了奇怪的错误。一切都很好,直到昨天为止,今天我对一个视图控制器进行了一些改进,它与AppDelegate无关。当我试图在模拟器上测试所做的更改时,出现了以下错误:
* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“无法在包中加载NIB:'NSBundle(loaded)',名称为'xxx'”。
我在Google和这个网站上搜索了很多,想寻找解决方案,但我找到的所有主题都涉及xib文件的问题。然而,我使用的是Storyboards,我的应用程序仅适用于iOS6.1,因此我没有任何xib文件。。我也检查了故事板是否包含在“Build Phases”中,一切看起来都没问题。我知道当一些文件被包含在Finder中但没有被包含在Xcode中时,就会发生这种错误,但这不是我的情况:我总是直接在Xcode中包含文件,并选中“将文件复制到目录”选项。我甚至尝试恢复我所做的更改,但我仍然有这个问题,所以我真的不知道发生了什么。我的应用程序在这个阶段非常简单,我只有几个通过导航控制器连接的视图控制器和1个外部框架(AFNetworking)。我的AppDelegate(发生错误的地方)很干净:我没有添加任何样本代码提供的内容。
我真的被卡住了,希望你能找到解决方法来帮助我解决它。

你本地化了你的故事板吗? - danypata
不,我有自动提供的“en”本地化故事板(我猜是这样)。但我没有做任何本地化我的应用程序的工作。 - user2285781
还有一件事,点击你的故事板文件 -> 显示文件检查器 -> 目标成员资格,确保项目上有一个勾选标记。 - danypata
错误信息中真的写着“...名称 'xxx'”吗? - mharper
不,我改成了放 xxx,但是真正的“nam”只是一个不能给出任何指示的代码(而且会增加标题的重量^^)。如果我错了,请纠正我。 - user2285781
2个回答

1
首先,尝试使用Xcode/Product/Clean菜单项。如果这样做不起作用,那么转到组织者,切换到项目,并删除您的项目的派生文件夹。如果您执行第二个步骤,请退出Xcode并重新启动,以确保所有内容都被清除。
编辑:如果您愿意,将其压缩并发送到我的个人资料中的电子邮件地址。我只能花几分钟时间查看它,但至少会看一下。
编辑2:在这里学到了一些东西,但没有解决方法。您所看到的是StoryBoard正在尝试生成rootViewController,但失败了-应用程序委托甚至没有收到消息。EventsTVC类会收到initWithCoder:消息,然后稍后会被要求返回其nibName。这个nibName是Storyboard中的标识符,并且是苹果内部用于构建nib的东西。但是,这失败了。您可以通过将此添加到EventsTVC来查看名称:
- (NSString *)nibName
{
    NSLog(@"NIB NAME %@", [super nibName]);
}

我为了重现问题所做的是创建一个新的StoryBoard Master/Detail应用程序,并将其添加到rootviewcontroller中:
- (NSString *)nibName
{
    NSLog(@"NIB NAME %@", [super nibName]);
    return [[super nibName] stringByAppendingString:@"foo"];
}

当然,这使得nibName是伪造的,并导致应用程序出现与您相同的消息而失败。

你有两个选择:你可以在这上面烧一个DTS事件 - 看看能否让苹果修复它(可能需要几天时间),或者你可以重新做项目,并将尽可能多的东西复制回新的App中。

无论如何,如果您可以向Apple发送相同的zip文件并创建错误报告,那将非常好。我怀疑故事板在内部是损坏的,但没有公共方法可用于深入探索它(查看UIStoryBoard)。


我都试过了。 "Clean" 方法没有改变任何东西,第二个方法也是一样... 当我在模拟器上启动应用程序时,异常会在 "main" 函数中发生,问题仍然存在。 - user2285781
不一定 - 这也会在你将块分派到主线程时显示。你设置了异常断点吗?如果没有,请设置它(在这里搜索如何设置一个 - 它非常容易)。想法是进入调试器发生的地方。你的改进 - 没有更改名称,对吧?叹气 - 我对故事板的经验很少。 - David H
是的,我刚刚给你发了电子邮件。谢谢! - user2285781
最终我解决了这个问题,而不需要从头开始重做我的项目。我意识到昨天在改进过程中对Storyboard进行了一些更改:我向主TVC添加了一个refreshControl。问题出在实现上,它不是通过编程方式实现的,而是通过Interface Builder实现的。我不知道我们只能通过编程方式设置refreshControls... - user2285781
哈哈!好有趣。我又做了些调查——看看苹果是如何做Storyboard的。在应用程序中,有一个包MainStoryboard.storyboardc。如果你打开它,你可以看到各种nib,在正确的代码下你甚至可以打开它们。它们有许多代理对象,所以整个storyboard就像一个使用一些现有部分(如nibs)的小型数据库。所以nib是存在的,但不一致性是由你的refreshControl导致的。对我来说,这仍然是一个bug——如果不能正确连接storyboard,苹果应该警告或失败。你提交了bug报告吗? - David H
显示剩余2条评论

1

自从ios7和Xcode 5以来,每天早上都会这样对我! 我不知道他们在xcode中搞了什么混乱,但这很烦人。 如果你想通过此错误,请前往组织者,然后删除“派生数据”(如果它不想删除,那么可以用好老的rm -rf在终端中删除),然后运行应用程序,它会再次崩溃,这一次进入模拟器并单击重置设置和所有内容。现在再次运行您的应用程序,您完成了:)!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接