笔尖已加载,但未设置“查看”出口


742

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

但是,当我单击工具栏图标时,该图标应该带我到创建的视图,NSInternalInconsistencyException但显示以下消息:

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

因此,我打开了我的nib文件,并且看到没有设置参考插座的视图。但是,我尝试单击并拖动“新引用出口”的圆圈到File's Owner,但这不会让我...我需要做些什么才能显示我的视图?


1
尝试先清洁构建。
LetynSOFT

就我而言,真正的错误是我在viewController中定义了一个方法(-(void)setValue:(NSNumber *)value forKey:(NSString *)键),该方法覆盖了导致错误的ViewController方法。我解决了重命名这个方法
基督教迷你

Answers:


1806

你们是对的,但由于我是新来者,我花了一些时间才弄清楚实现此目的的所有步骤。这对我有用:

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

我在可可上也遇到了这个问题,只要不加载视图/将视图添加到视图层次结构中,所有视图出口均为NIL。调用addSubview或类似方法后,所有插座均已连接。我故事的有趣部分是po viewcontroller.view.subviews显示了丢失的对象。
Apoc

11
从步骤4&5开始,此解决方案不再在Xcode 7.3中运行。而是在界面构建器中,按住Control键将其从文件所有者拖到View。
PeiweiChen 2016年

2
不适用于我(连接检查器中没有“插座”部分,因此在要连接的插座下没有“视图”),但是为您付出的努力而+1。:)
威廉·T·马拉德

2
如果您在插座中看不到“视图”,则还可以ctlr从文件所有者拖动到情节提要上的视图。上下文菜单应带有“查看”选项
josef 18'Apr

1
@ WilliamT.Mallard我也有同样的行为。MyViewController是的子类的子类,在“插座”下UIViewController没有view任何子类。如果我MyViewController直接从UIViewController视图中继承子类,则显示在“插座”下。Xcode的魔术或错误。
user2319066

201

这是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];

1
谢谢哈维尔·卡拉特拉瓦·拉维利亚(Javier CalatravaLlavería)。。。我的头部撞了一个小时,对我有很大帮助!!!
BharathRao

退出更多信息
Bruno Sosa Fast Tag

我错过了第五步
hamada147

73

我通常可以通过重新建立文件所有者和视图之间的连接来修复它。从文件的所有者按住Control并拖动到您的View(在IB中),然后从弹出菜单中选择视图。


62

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


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

29

您确定已将UIView(或子类)分配给yourViewController的“ view”属性吗?

在xib的左窗格中,为yourViewController右键单击“文件所有者”,并确认已设置“视图”出口。如果没有,将其设置为视图!

这肯定会解决问题


2
简洁明了的答案。
sark9012

15

对我来说,这里https://stackoverflow.com/a/6395750/939501所述的所有内容都是真实的,但是仍然抛出错误,原因是我创建了一个名称为ABCView的View类,然后将其删除,后来我添加了一个View Controller作为ABCViewController以某种方式在新的视图控制器中引用了旧的ABCView,因此我不得不删除ABCViewController并添加一个新名称不同的名称来解决我的问题。

谢谢


仍然是2020
TamásSengel

15

我对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];
}

10

对于使用xib方法创建UIView并遇到此问题的任何人,您都会注意到在连接检查器菜单下将没有“视图”出口。但是,如果将File的Owners自定义类设置为UIViewController,然后将看到“视图”出口,您只需CMND即可将出口连接到CustomView。


太棒了 非常感谢。这应该是一个可以接受的答案!
罗马

7

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


6

刚刚花了一个多小时试图找出为什么从笔尖启动视图属性时未在视图控制器中设置视图属性的原因。请记住在视图控制器的initWithNibName内部调用“ [super initWithNibName ...]”。


5

我只是把这个固定在我的。大项目,两个文件。一个是“ ReallyLargeNameView”,另一个是“ ReallyLargeNameViewController”

根据上面选择的第二个答案,我决定应该清理自己的构建。Nada,但我仍然怀疑XCode(因为我有两个相同的类,应该对它们进行抽象,但是……)所以,一个人在工作,而不是。文件的所有者名称已达到复制和粘贴的程度,重新命名了出口,重新启动了xCode,仍然一无所获。

因此,我删除了类似的命名类(这是一个视图)。不久,新错误“字面上的插座未连接”实际上是“ webView不是键值”等等……基本上是说“ Visual Studio更好”。无论如何...我删除了较小的命名文件,并且bam,它起作用了。

XCode被名称相似的文件所混淆。该项目足够大,需要重新启动,这可能是其中的一部分。

希望我能得到比“ XCode混乱”更多的技术答案,但是好吧,xCode在这一点上变得非常混乱。不用困惑,就像我会帮助一个小孩一样。它现在可以工作,:)如果上述方法不能解决问题,则应该使他人受益。

永远记住要清理构建(也要删除模拟器)


4

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


4

我不小心删除了xib引用并再次添加它时遇到了同样的问题。我只是通过在文件所有者和视图之间建立连接来进行固定的,还请确保您的FilesOwner的自定义类是您期望的viewController。


3

对我而言,问题是由致电引起的initWithNibName:bundle:。我正在使用来自nib文件的表格视图单元格来定义位于的输入表单tableViews。由于我没有观点,因此与某个观点挂钩是没有意义的。相反,如果我initWithStyle:改为调用该方法,然后从那里加载nib文件,则事情将按预期进行。


3

先前的答案几乎可以解决我的问题,但缺少最后一步。

  1. 用相同的名称创建一个xib和swift文件。

添加视图和Swift文件

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

在此处输入图片说明

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

添加contentview

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

将contentview添加为子视图

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

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

干杯,理查德


2

我遇到了同样的问题,但是需要一个稍微不同的解决方案。在这种情况下,问题是文件所有者的类,而不是视图的类。要进行此设置,我必须单击Interface Builder窗口左下角的“向后播放”图标,然后出现一些选项,这些选项隔离了文件所有者,First Responder和View的特征。单击第一个(一个透明的大框),然后使我能够如上所述设置其自定义类。


2

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


2

今晚,我遇到了一个与Swift UIViewController子类非常相似的东西。在这种情况下,以上修复程序均无效,但是对我的代码进行了一些重新排序。尽管对子类进行了很好的编译,但在同一文件中子类的定义本身之前,对子类进行扩展的Net-net似乎使XCode感到困惑。解决方法是将扩展名放在子类的定义之后。

我已经在回答类似问题的细节张贴了细节。


2

就我而言,指定的初始值设定项 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil *** ViewController类中,因此即使当我调用其他初始值设定项来初始化对象时,也会调用指定的初始值设定项。

因此,解决该问题的- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法也是正确的方法。


2

我遇到的问题与此处的其他答案略有不同。

如果我只是简单地创建了一个新的xib文件,则在Interface Builder中向其中添加了一个UIViewController,并将该UIViewController的自定义类设置为我的视图控制器,则导致“未设置视图出口”崩溃。这里的其他解决方案是将视图出口控制拖动到View,但是对我来说,视图出口是灰色的,我无法对其进行控制拖动。

灰显视图插座

我发现我的错误是在Interface Builder中添加了UIViewController。相反,我必须添加一个UIView,并将文件所有者的自定义类设置为我的视图控制器。然后,我可以控制将文件所有者的视图出口拖到我的新视图UIView中,一切都可以正常进行。


1

在我的项目中发生了相同的错误,但原因不同。在我的情况下,我在自定义UITableViewController类中使用名称为“ View”的IBOutlet设置。我知道“视图”很特别,因为它是基类的成员,但是我认为“视图”(不同的情况)也不会有问题。我猜可可的某些区域不区分大小写,可能装载一个xib是这些区域之一。所以我刚刚将其重命名为DefaultView,现在一切都很好。


1

选择文件所有者,然后打开身份检查器,为其指定对应的类名称。如果以上方法均不起作用,但仍然看不到视图出口,则给新的引用出口提供与文件所有者的连接,然后就可以看到视图出口。单击视图插座,以在视图插座和文件所有者之间建立连接。运行该应用程序可以正常工作。


1

就我而言,该视图未在xib中查看。在xib中,视图的大小为none(无)(右侧第4个标签)。我将大小设置为Freeform并重新加载xCode。视图已被上诉,我将正确的链接设置为视图。


1

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

我正在专门通过在Swift中单独创建文件来发现此问题。


1

对我来说,发生的时候

  • 我有一个与Nib文件关联的ViewController类(.mm / h),
  • 该ViewController的UIView必须作为子视图加载到另一个视图上,

  • 我们将这样称呼

    -(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;

}

在这里,缺少loadView ,,添加此行解决了我的问题。


1

我发现了同样的问题,这是因为我在Content选项Table View的属性中勾选了“ 静态单元格 ” 。更改为“ ”时有效。屏幕截图如下。 Dynamic Prototypes在此处输入图片说明


1

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


1

打开您的viewController 所在的情节提要文件或带有textEdit.app的XIB相关文件,并检查该情节提要或XIB名称是否与viewController相同,然后进行更改,保存并重新加载/重新启动Xcode。


1

如果您使用的是自定义init方法,请检查返回的内容是否有效。我遇到了这样的一段代码,它崩溃了:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

在另一个类中,控制器的创建方式如下:

CustomController *controller = [[CustomController alloc] init];

问题是在init方法中,self尚未更改,应改为如下所示:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}

0

我想支持StephenJ。有时候X代码确实很混乱。我刚刚经历了很多使用UI的经历,并多次添加和删除了网点。插座将不再接线。我从来没有弄清楚具体的原因(我已经尝试了上面的所有解决方案),我只需要删除NIB并从头开始创建它,实际上,在NIB起作用之前,必须使用其他名称。(XCode 4.6.1)为此浪费了几个小时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.