'NSInternalInconsistencyException',原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载了GameView笔尖,但未设置视图插座

时间:2011-03-28 19:27:59

标签: iphone interface-builder xcode4

这与此处众多其他类似问题的情况不同。

*由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载了GameView笔尖但视图出口未设置。

你可能会想“按照它的说法,将文件所有者连接到IB中的视图!”。但问题是,我甚至在项目中甚至在项目目录中都没有GameView.xib。

我的项目中有一个“GameViewController.m”和匹配的“GameViewController.xib”。使用GameViewController会出现这个错误,但我不明白尝试加载“GameView.xib”的想法。它不应该使用“GameViewController.xib”吗?


如果我grep我的项目目录,我确实看到它来自“UserInterfaceState.xcuserstate”。

<string>file://localhost/Users/bemmu/Dropbox/b2/iphone/ValleyStory/ValleyStory/GameView.xib</string>

此提到的文件不存在。我之前可能有一个带有该名称的文件,并重命名/删除它,但它没有被我在IB中看到的任何地方引用。

我是否设法混淆了xcode?

12 个答案:

答案 0 :(得分:19)

我的解决方案有点不同。

  1. 单击界面构建器中的xib
  2. 选择左侧的文件所有者
  3. 打开文件所有者的连接检查器
  4. 如果尚未连接视图属性,请将其拖动到视图图标(在文件所有者和第一响应者图标下)。

答案 1 :(得分:5)

检查您正在使用的任何nib文件(如MainWindow.xib)。如果要从笔尖加载GameViewController,请检查它正在加载的文件(在检查器的信息选项卡下)。确保它设置为“GameViewController”而不是“GameView”。

答案 2 :(得分:5)

我也有这个问题,但必须以不同的方式解决它。基本上,我有一个视图控制器名称MainViewController,它有一个名为MainViewController.xib的xib。这个笔尖的视图属性设置为文件所有者,它是MainViewController。

我还创建了一个MainView.xib,其中包含一个视图,该视图将以编程方式添加到MainViewController.xib中定义的视图及其视图中。它基本上封装了一个内部视图,该视图位于MainViewController.xib的视图中,并且还将其文件所有者设置为MainViewController。

基本上,我希望MainViewController.xib作为MainViewController对象的nib加载,而在MainViewController中,稍后,我会添加MainView.xib指定的内部视图。

出现了几个问题:

1。)我在Apple文档中发现通过storyboard或nib加载视图控制器时:

  

“如果视图控制器类名称以”Controller“结尾,则为   在MyViewController中,它查找名称与之匹配的nib文件   没有单词“Controller”的类名,如MyView.nib。

     

它查找名称与视图名称匹配的nib文件   控制器类。例如,如果类名是MyViewController,   它查找MyViewController.nib文件。“

因此,如果你还有一个名为MainViewController的nib并希望MainViewController.xib成为MainViewController的主要nib,你就不能有一个名为MainView.xib的nib。

2.。)即使您删除MainView.xib或将其重命名为其他东西(在本例中为MainInternalView.xib),您必须删除/清理您的iOS模拟器,因为旧的nib文件(MainView.xib)仍将保留应用程序。重建/重新运行应用程序时,它不会覆盖整个应用程序包。

如果您不想重置内容设置(可能需要保留一些数据),请右键单击iOS模拟器文件夹中的应用程序,显示包内容,找到MainView.nib,然后删除它。重建时Xcode不会自动为您执行此操作,因此我们需要手动删除旧笔尖。

总的来说,不要让名为MainViewController和MainView的nib,即具有相同前缀的nib。调用MainView.xib,比如MainInternalView.xib。

答案 3 :(得分:2)

我最近解决了这个问题。确保在按照此处给出的步骤(以防万一)之前备份项目。这些步骤解决了我的问题

  1. 退出Xcode
  2. 导航至位于UserInterfaceState.xcuserstate的{​​{1}}并删除该文件。
  3. 重新打开Xcode。 Xcode将创建一个新的.xcodeproj/project.xcworkspace/xcuserdata/<username>.xcuserdata,它将是干净的。

答案 4 :(得分:1)

在我的情况下,我根本没有使用xib。我需要从Build Phases&gt;中删除.m文件。编译源并将其添加回来。

答案 5 :(得分:0)

鉴于您之前引用它,听起来xcode尚未确认它不再存在。从产品菜单中选择“清洁”,然后选择“构建”,希望这将超过您的旧参考。

答案 6 :(得分:0)

面对同样的问题,必须在代码中更改视图的名称:

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"WrongViewName" bundle:nil];

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"RightViewName" bundle:nil];

答案 7 :(得分:0)

我有多个观点,偶然(我不知道这是怎么发生的)但我的背景视图没有文件所有者,因此对于将来遇到此问题的其他人,请确保所有观点拥有文件所有者。

答案 8 :(得分:0)

我遇到了同样的错误,然后从界面构建器中检查类名,看到我在自定义类属性中键入了视图控制器类名。

答案 9 :(得分:0)

UIViewController在传递nil到initWithNibNamed:bundle:时搜索与控制器同名的nib。检查传递给初始化程序的文件名是否正确且存在!

例如:(例如[[CCVisitorsController alloc] initWithNibName:nil bundle:nil]然后UIViewController尝试加载名称为CCVisitorsController的nib作为默认值。

如果该文件不存在,则抛出您提到的错误。

答案 10 :(得分:0)

我遇到了这个问题,因为我在

做了一件坏事
  • (id)initWithCoder:(NSCoder *)编码器

NIB加载。

答案 11 :(得分:0)

在我的情况下,这个错误是由愚蠢的错误产生的 - 我删除_view视图 dumb mistake