已加载nib文件但未设置“view”插座

817

我向项目中添加了一个新的nib文件,并尝试加载它。

然而,当我点击工具栏图标以进入我创建的视图时,出现了一个NSInternalInconsistencyException异常,错误信息为:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "..." nib but the view outlet was not set.'

于是,我打开了我的nib文件,发现对于这个视图没有设置引用插座。但是,我尝试将“新引用插座”圆圈拖到File's Owner处,但却无法这样做...我需要做什么才能让我的视图显示出来?


1
先尝试清理构建。 - LetynSOFT
在我的情况下,真正的错误是我在viewController中定义了一个方法(- (void) setValue:(NSNumber*)value forKey:(NSString*) key),覆盖了ViewController方法,导致了错误。我通过重命名这个方法来解决问题。 - christian mini
32个回答

1951

以下是对我有效的步骤:

  • 打开出现问题的XIB文件。
  • 点击左侧栏上方的"文件所有者图标"(顶部那个,看起来像一个带有黄色轮廓的盒子)。
  • 如果没有看到右侧的侧边栏,请单击工具栏中"视图"上方的第三个图标。这将显示右侧的侧边栏。
  • 在右侧栏中,单击第四个选项卡--它看起来有点像一张报纸。
  • 在顶部的"自定义类"下,确保类是应该对应于此视图的ViewController的名称。如果不是,请输入它。
  • 在右侧栏中,单击最后一个选项卡--它看起来像一个带有箭头的圆圈。
  • 您应该看到"输出口",下面是"查看"。将其旁边的圆形拖动到左侧栏上的"视图"图标(底部一个,看起来像一个带有厚灰色轮廓的白色正方形)。
  • 保存xib并重新运行。

我在cocoa上也遇到了这个问题,只要视图没有被加载/添加到视图层次结构中,所有视图输出点都是NIL。调用_addSubview_或类似的函数后,所有的输出点都会连接好。我的故事有趣的地方在于,_po viewcontroller.view.subviews_显示了丢失的对象。 - Apoc
21
从第4步和第5步开始,此解决方案在Xcode 7.3中不再适用。相反,在界面构建器中,从文件所有者(Control)拖动到你的视图(View)。 - PeiweiChen
2
对我没用(连接检查器中没有插座部分,因此没有“视图”下的插座可连接),但是+1是为了你在回答中付出的努力。 :) - William T. Mallard
2
如果您在输出中看不到“视图”,您也可以从文件所有者向故事板上的视图进行ctlr-drag操作。应该会出现一个上下文菜单,其中包含“视图”选项。 - josef
4
我有相同的问题。MyViewControllerUIViewController 的子类,然后再被继承了一次,但是在“Outlets”下没有“view”选项。如果我直接从 UIViewController 继承 MyViewController,则视图会显示在“Outlets”下。这是 Xcode 的魔法还是 bug。 - user2319066
显示剩余7条评论

265

这是Josh Justice的提议,但以图形方式呈现(图片为我自己制作):

  1. 选择文件所有者
  2. 在右侧面板上选择自定义类。
  3. 输入自定义类名称

enter image description here

  1. 在右侧面板上选择outlets
  2. 将view outlet拖动到视图组件中

enter image description here

最后使用滚动代码实例化View Controller:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];

1
我错过了第五步。 - hamada147

77

通常我可以通过重新建立文件拥有者和视图之间的连接来解决这个问题。在IB中,从文件拥有者向视图进行控制拖动,并从弹出菜单中选择视图。


65

视图标识 - 类标识未设置。将其设置为适当的类后,问题得到解决。


嗨,@John,我已经做了这个,但仍然遇到了异常。 - Mansuu....

33
你确定你已经将一个UIView(或其子类)分配给了你的ViewController的“view”属性吗?
在yourViewController的xib左侧面板上右键单击“文件所有者”,并验证“视图”插座是否已设置。
如果没有设置,请将其设置为一个视图!
这绝对会解决问题。

3
清晰简明的回答。 - sark9012

17

我遇到了一个与其他答案略有不同的问题。

如果我只是创建了一个新的xib文件,在界面构建器中向其中添加一个UIViewController,并将该UIViewController的自定义类设置为我的视图控制器,那么就会导致“未设置视图插座”崩溃。其他解决方案都建议控制拖动视图插座到View,但是对于我来说,视图插座是灰色的,我无法控制拖动它。

灰色的View插座

我发现我的错误在于在界面构建器中添加了一个UIViewController。相反,我必须添加一个UIView,并将文件所有者的自定义类设置为我的视图控制器。然后,我可以控制拖动文件所有者的视图插座到我的新视图UIView上,一切都可以按预期工作。


这样做!只需创建视图并将UIViewController设置为文件所有者即可。谢谢! - regina_fallangi

16

我在XCode 4.6.3中遇到了同样的问题。我最开始有一些文件名为MySettingsView.h.m,但是我删除它们,使用MySettingsViewController.h替代,但尽管试过这里提到的大部分提示,仍然会出现以下错误:

2013-07-05 11:48:17.205 MyApp[39024:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MySettingsView" nib but the view outlet was not set.'

显然,它依然“困惑”,试图加载MySettingsView.xib而不是MySettingsViewController.xib。也许它的“做我想要的”逻辑太复杂了。

因此,我通过在MySettingsViewController.m中硬编码NIB/XIB名称来解决了这个问题:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}

16

对我来说,这里提到的所有内容都是正确的,但还是出现了错误,原因是我创建了一个名为ABCView的View类,然后将其删除,之后我添加了一个名为ABCViewController的视图控制器,所以一些地方在新的视图控制器中仍然引用旧的ABCView,我不得不删除ABCViewController并添加一个新的带有不同名称的视图控制器来解决我的问题。

谢谢


2020年仍存在一个错误。 - Tamás Sengel

14

如果您使用xib方法创建UIView并遇到此问题,您会注意到在连接检查器菜单下没有“view”出口。但是,如果将文件所有者的自定义类设置为UIViewController,然后您将看到“view”出口,您可以直接使用CMND连接一个出口到CustomView。


太棒了。非常感谢。这应该是一个被接受的答案! - Roman

8

我的问题是由于在类文件夹中有一个重复的nib文件,没有设置视图。xcode似乎会选择一个nib进行构建,然后在下一次构建项目时选择另一个nib。只需删除另一个即可。看起来很好。Doh!


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