使用storyboarding时无法加载'NSBundle中的NIB。

16

我使用应用程序一段时间后会出现以下错误。通常需要50到100次操作才会导致崩溃。但我无法理解它,因为我正在使用storyboards,而且这是一个NIB错误。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Could not load NIB in bundle: 'NSBundle 
</Users/me/Library/Application Support/iPhone Simulator/5.0/Applications/GUID/appname.app>
(loaded)' with name 'MainStoryboard_iPhone.storyboardc/q8p-MH-tsT-view-acD-hJ-g0C''

我不确定从哪里开始寻找,但我认为这意味着Storyboard已经损坏了吗?

我查看了所有的源代码,但是没有在任何地方找到"nib"这个字符串,所以也没有nibWithNibName类似的调用。我也没有一个MainWindow.xib文件,尽管我尝试创建了一个。当我使用Storyboard时,我不确定它是否可以设置为主界面。然而,在.xcodeproj/project.pbxproj文件中有一个对.nib的引用:

/* Begin PBXBuildRule section */
148BDD4C14AE8D5E002C30ED /* PBXBuildRule */ = {
    isa = PBXBuildRule;
    compilerSpec = com.apple.compilers.proxy.script;
    fileType = wrapper.nib;
    isEditable = 1;
    outputFiles = (
    );
    script = "$(DEVELOPER_BIN_DIR)/ibtool\n";
};

我正在使用Xcode 4.2中的故事板。我的主要故事板设置为MainStoryboard_iPhone,其文件名为MainStoryboard_iPhone.storyboard。

崩溃发生在iOS 5模拟器中。


1
你好,欢迎来到SO。如果你在段落开头使用4个空格缩进,它会将它们格式化为代码。我已经为你纠正了这个问题。 - jrturton
2
关于您的问题,当加载新视图时,故事板将在后台代表您调用loadnibnamed或类似方法。如果您查看故事板中的身份检查器,您会看到一个名为对象ID的字段 - 其中之一应该与您在错误信息中看到的字符串的一部分匹配(q8p...)。这应该可以缩小它正在尝试加载的范围。 - jrturton
1
只是补充一下,这就是问题的所在。第三方组件出现了内存泄漏。一旦资源枯竭,它就会以上述错误崩溃。经过几周的 QA/Beta 测试,确认问题已经解决。谢谢。 - stubble jumper
2
这个问题仍然是开放的,如果您已经找到了解决方案,您可能想要回答它。 :) - jackslash
请问您能告诉我您是如何解决这个问题的吗? - Umang Kothari
显示剩余3条评论
3个回答

43

我也遇到了完全相同的错误。

最终我发现原因是在- (id)initWithCoder:(NSCoder *)aDecoder中,在self.tableView被初始化之前就访问了它。

所以,我将那些代码移到了- (void)viewDidLoad中,一切都顺利了。


太奇怪了,以前它是可以工作的,但是我什么都没改,只是做了一些魔法,然后它开始崩溃了,你的解决方案是正确的!谢谢! - dreamzor
3
为了理解故事板的流程,有几个规则需要注意:
  1. 不要在init函数(例如:initWithCoder)中执行任何UI设置;
  2. 在viewDidLoad或viewWillAppear中进行UI设置;
  3. 理解初始化步骤:initializeViewControllerWithIdentifier -> viewDidLoad -> (如果您在父视图控制器中进行了进一步的操作,则会覆盖viewDidLoad)-> viewWillAppear -> viewDidAppear。
- morph85
谢谢DaiZW,你救了我的一天!就像dreamzor一样,我的应用程序在没有任何更改的情况下开始崩溃。请注意;我的initWithCoder:中的初始化代码并不涉及UI,只是分配一个单例模型对象。顺便说一句,为了确定问题的来源,知道“name”可能指的不止一个对象可能会有所帮助;我的“78L-th-1kK-view-ZbE-ni-SzJ”指的是TableVC“78L-th-1kK”,TableView“ZbE-ni-SzJ”。 - cate

2

这个问题似乎已经在评论区得到了回答。在这里重新发布一下,以便问题显示为已有答案。-- gs。

答案来自评论区:

一个第三方组件中存在内存泄漏问题。一旦资源被耗尽,它会崩溃并显示上述错误。经过几周的QA/Beta测试确认问题已经解决。谢谢。- stubble jumper Jan 24 at 2:29


您应该将此标记为社区wiki-您正在做正确的事情,但任何您获得的赞不属于您本人。 - jrturton
好的,你说得对。不太确定具体该怎么做。如果你能指点我正确的方向,我就可以进行更改。 - Greg Steiner

0

我以前遇到过这个问题。当我使用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 作为我的初始化时,我的nib名称与我的视图控制器名称不同。


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