加载的笔尖但“视图”插座未设置

问题描述 投票:687回答:27

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

但是,当我点击应该带我到我创建的视图的工具栏图标时,我得到一个带有消息的NSInternalInconsistencyException

由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载了“...”笔尖,但未设置视图插座。

所以我打开了我的nib文件,我看到没有设置引用插件的视图。但是,我尝试单击并将“新引用插座”的圆圈拖动到文件所有者,但它不会让我...我需要做什么才能显示我的视图?

ios cocoa-touch interface-builder xib
27个回答
1715
投票

你们是对的,但由于我是新人,我花了一点时间才弄清楚要做的所有步骤。这对我有用:

  • 打开XIB文件导致问题
  • 单击左侧栏上的文件所有者图标(顶部一个,看起来像一个黄色的方框)
  • 如果您没有看到右侧边栏,请单击工具栏中“视图”上方的第三个图标。这将显示右侧边栏
  • 在右侧边栏中,单击第三个选项卡 - 看起来有点像报纸的选项卡
  • 在顶部的“自定义类”下,确保Class是应与此视图对应的ViewController的名称。如果没有,请输入它

  • 在右侧边栏中,单击最后一个选项卡 - 看起来像一个带箭头的圆圈
  • 您应该看到“outlet”下面带有“view”。将旁边的圆圈拖到左侧栏上的“视图”图标(底部的一个,看起来像一个带有灰色粗轮廓的白色方块

  • 保存xib并重新运行

4
投票

花了不止一个小时试图找出为什么我的视图属性没有在从nib启动它时在我的视图控制器中设置。记得在视图控制器的initWithNibName中调用“[super initWithNibName ...]”。


4
投票

我刚刚修好了。大项目,两个文件。一个是“ReallyLargeNameView”,另一个是“ReallyLargeNameViewController”

基于上面选择的第二个答案,我决定要清理我的构建。 Nada,但我仍然怀疑XCode(因为我有两个相同的类,应该抽象它们但是......)所以一个人正在工作,一个人没有。文件的所有者名称是复制和粘贴,插座重新挂起,xCode重新启动,仍然没有。

所以我删除了类似的命名类(这是一个视图)。很快,新的错误“插座内部没有连接”字面上是“webView不是键值”等等......基本上说“Visual Studio更好”。无论如何...我删除了较小的命名文件,而bam,它的工作原理。

XCode被类似命名的文件所困惑。而且该项目足够大,需要重新启动,这可能是其中的一部分。

希望我有一个比“XCode感到困惑”更具技术性的答案,但是,xCode在这一点上变得很混乱。像我帮助一个小孩一样解除困惑。它现在有效,:)如果上面没有解决任何问题,应该让其他人受益。

永远记得清理你的构建(通过删除模拟器)


3
投票

我也有同样的问题,我的问题是我添加了一个其他本地化(英语)到ViewControllers笔尖所以我的本地化德语的应用程序无法找到本地化英语的笔尖!希望这对任何人都有帮助!


3
投票

我不小心删除了xib引用时遇到了同样的问题并再次添加它。我只是通过在Files owner和view之间建立连接来修复。还要确保你的FilesOwner的自定义类是你期望的viewController。


1
投票

对我来说,问题是由调用https://stackoverflow.com/a/6395750/939501引起的。我正在使用来自nib文件的表格视图单元格来定义位于initWithNibName:bundle:上的条目表单。因为我没有观点,所以挂钩到一个没有意义。相反,如果我改为调用tableViews方法,并在那里,我加载nib文件,然后事情按预期工作。


1
投票

我有同样的问题,但需要一个稍微不同的解决方案。这种情况下的问题是文件所有者的类,而不是视图的类。要设置它,我必须单击Interface Builder窗口左下角的“向后播放”图标,然后出现选项,隔离文件所有者,第一响应者和视图的特征。单击第一个(一个大的透明框),使我能够按照上面的建议设置其自定义类。


1
投票

我有同样的问题,但需要一个不同的解决方案。在这种情况下的问题是文件所有者的类没有连接到xib文件。


1
投票

今晚我遇到了一个非常相似的东西,有一个Swift UIViewController子类。在这种情况下,上述修复都没有奏效,但重新排序了我的代码。 Net-net,子类的扩展发生在子类的定义本身在同一个文件中似乎混淆了XCode,尽管编译正常;修复是将扩展放在子类的定义之后。

我发布了详细信息initWithStyle:


1
投票

在我的例子中,*** ViewController类中的指定初始化器in an answer to this similar question已经实现,所以即使我在调用其他初始化器来初始化对象时,也会调用指定的初始化器。

所以要解决这个问题,检查qazxsw poi是否也是一种正确的方法。


0
投票

在我的项目中遇到了同样的错误,但原因不同。在我的例子中,我的自定义UITableViewController类中有一个名为“View”的IBOutlet设置。我知道“视图”很特别,因为它是基类的成员,但我不认为View(不同的情况)也是一个问题。我猜Cocoa的某些区域不区分大小写,并且可能加载xib是其中一个区域。所以我只是将它重命名为DefaultView,现在一切都很好。


166
投票

这是Josh Justice的建议,但是以图形方式(图片是我的):

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

  1. 在右侧面板上选择插座
  2. 拖动视图出口以查看组件

最后,使用滚动代码实例化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];

0
投票

选择文件所有者并转到打开标识检查器,给出它对应的类名。如果上述方法都不起作用,仍然无法看到视图插座,则将新的参考插座连接到文件所有者,然后您就可以看到视图插座。单击视图插座以在View Outlet和File的所有者之间建立连接。运行应用程序这很好。


0
投票

我想要第二个Stephen J.有时X Code会让我感到困惑。我刚刚有过一次体验,我曾经玩过很多UI,并且已经添加和删除了很多次。这些网点不再接线了。我从来没有弄清楚具体的原因(我已经尝试了上面的所有解决方案),我只需要删除NIB并从头开始重新创建它,事实上它必须在它工作之前使用不同的NIB名称。 (XCode 4.6.1)浪费了几个小时。


0
投票

就我而言,视图没有在xib中查看。在xib中,View是size = none(右手第4个选项卡)。我将大小设置为Freeform并重新加载xCode。视图被上诉,我设置了View的正确链接。


0
投票

如果您已经尝试了所有内容但仍然遇到此错误,请尝试从头开始重新创建类文件,但请记住选中“还创建XIB文件”复选框。这将在单独创建这些文件时自动链接一些未链接的项目。创建完成后,您可以将所有内容剪切并粘贴到新的XIB上,它应该可以正常工作。

我发现这个问题特别是在Swift中单独创建文件。


0
投票

对我来说,它发生了,何时

  • 我有一个与Nib文件关联的ViewController类(.mm / h),
  • 来自此ViewController的UIView必须作为子视图加载到另一个视图上,
  • 我们会打这样的话 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

哪里

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

这里loadView丢失,,,添加此行解决了我的问题。


0
投票

我有同样的问题,我想通了,这是因为我在“内容”选项下的“表视图”属性中勾选了“静态单元格”。工作时改为“-(void)initCheckView{ CheckView *pCheckViewCtrl = [CheckView instance]; pCheckView = [pCheckViewCtrl view]; [[self view]addSubview:pCheckView]; [pCheckViewCtrl performCheck]; } ”。屏幕截图如下。 +(CheckView *)instance{ static CheckView *pCheckView = nil; static dispatch_once_t checkToken; dispatch_once(&checkToken, ^{ pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil]; if ( pCheckView){ [pCheckView initLocal]; **[pCheckView loadView];** } }); return pCheckView; }


0
投票

我在Xcode 9.3中遇到了类似的问题,并在“文件所有者”属性检查器下将“模块”设置为项目模块,为我修复了这个问题。


0
投票

以前的答案几乎解决了我的问题,但最后一步却没有了。

  1. 创建具有相同名称的xib和swift文件。

Dynamic Prototypes

  1. 将文件所有者设置为UIView子类。

enter image description here

  1. 将一个出口从View拖到UIView子类,将其命名为“contentView”

Add View and Swift File

  1. 添加此自定义初始化程序,以便在xib加载时附加contentView

enter image description here

add the contentview

现在,您添加的任何@IBOutlets都将被附加。

干杯,理查德


68
投票

我通常可以通过重新创建File的Owner和视图之间的连接来解决它。按住Ctrl键从文件所有者拖动到View(在IB中),然后从弹出菜单中选择视图。


59
投票

未设置View Identity - Class Identity。将其设置为适当的类后,问题得到解决。


27
投票

你确定你有一个UIView(或子类)分配给你的ViewController的“view”属性?

右键单击xib左侧窗格中的“文件所有者”,查看yourViewController并验证是否设置了“视图”插座。如果没有,请将其设置为视图!

这肯定会解决问题


14
投票

我对XCode 4.6.3也有同样的问题。我开始时有几个名为MySettingsView.h.m的文件,但删除了它们以支持MySettingsViewController.h,但尽管尝试了这里提到的大多数提示,它仍然保持错误,

2013-07-05 11:48:17.205 MyApp [39024:c07] ***由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载了“MySettingsView”笔尖但视图出口没有定。“

它显然仍然“困惑”,试图加载MySettingsView.xib而不是MySettingsView Controller.xib。也许它的“做我的意思”逻辑过于花哨。

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

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

13
投票

对我来说,这里陈述的所有事情都是真的,但仍然是抛出错误,原因是我创建了一个名为ABCView的View类,然后将其删除后我添加了一个视图控制器作为ABCViewController,所以不知怎的它在新视图中引用了旧的ABCView控制器,我不得不删除ABCViewController并添加一个具有不同名称的新问题解决了我的问题。

谢谢


6
投票

我的问题是由于类文件夹中没有视图集的重复nib引起的。 xcode似乎在为构建选择一个笔尖,然后在下次构建项目时选择另一个笔尖。刚刚删除了另一个。看起来不错。卫生署!


5
投票

对于使用xib方法创建UIView并遇到此问题的任何人,您会注意到在连接检查器菜单下您将没有“视图”插座。但是,如果您将文件所有者自定义类设置为UIViewController,然后您将看到“视图”插座,您可以通过CMND将插座连接到CustomView。

© www.soinside.com 2019 - 2024. All rights reserved.