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

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

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

由于未捕获的异常而终止应用程序UIViewController是否必选//UIViewController是否必选_loadViewFromNibNamed: bundle:]加载了“…”笔尖,但未设置视图出口。'

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

286780 次浏览

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

以下是对我有用的:

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

刚刚花了一个多小时试图找出为什么我的view属性在从nib启动时没有在我的view控制器中设置。记得在你的view控制器的initWith NibName中调用“[Super initWith NibName…]”。

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

我也有同样的问题,我的问题是,我添加了另一个本地化(英语)到ViewController笔尖,所以我的应用程序与本地化德语无法找到笔尖与本地化英语!

对我来说,问题是由调用initWithNibName:bundle:引起的。我使用nib文件中的表视图单元格来定义位于tableViews上的条目表单。由于我没有视图,因此挂钩到一个没有意义。相反,如果我调用initWithStyle:方法,并从那里加载nib文件,那么事情就会按预期工作。

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

我刚刚在我的项目中修复了这个问题。大型项目,两个文件。一个是“ReallyLargeNameView”,另一个是“ReallyLargeNameViewController”

基于上面选择的第二个答案,我决定我应该清理我的构建。Nada,但我仍然怀疑XCode(因为我有两个相同的类,应该抽象它们,但是……)所以一个在工作,一个不在。文件的所有者名称是复制和粘贴的,网点重新连接起来,xCode重新启动,仍然什么都没有。

所以我删除了类似的命名类(这是一个视图)。很快,新的错误“内部没有连接”字面意思是“webView不是键值”等等……基本上是说“Visual Studio更好”。不管怎样……我擦除了较小的命名文件,砰,它起作用了。

XCode被名称相似的文件弄糊涂了。而且项目足够大,需要重新启动一下,这可能是它的一部分。

希望我能有一个比“XCode很困惑”更技术的答案,但是,在这一点上,xCode会变得很困惑。就像我帮助一个小孩一样来解决它。它现在起作用了,:)如果上面没有解决任何问题,应该会让其他人受益。

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

我通常可以通过重新创建文件所有者和视图之间的连接来修复它。控制-从文件所有者拖动到您的视图(在IB中)并从弹出菜单中选择视图。

只是在我的项目中出现了相同的错误,但原因不同。在我的案例中,我在我的自定义UITableViewController类中使用了一个名为“View”的IBOutlet设置。我知道“view”很特别,因为它是基类的成员,但我不认为View(不同的大小写)也是一个问题。我猜Cocoa的某些区域不区分大小写,可能加载xib就是其中一个区域。所以我把它重命名为DefaultView,现在一切都好了。

选择文件所有者并打开身份检查器,给出它对应的类名。如果上述方法都不起作用,并且仍然看不到视图出口,则将新的引用出口连接提供给文件所有者,然后您可以看到视图出口。单击视图出口以在视图出口和文件所有者之间建立连接。运行应用程序这可以正常工作。

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

我支持Stephen J.有些时候,X Code的确会感到困惑,因为之前做了很多UI,加了很多次网点,删了很多次网点,网点就接不上了,我一直想不出具体的原因(上面的办法我都试过了),我只需要删除NIB,从头开始重新创建,而且还得给NIB换个名字,NIB才能正常工作。(XCode 4.6.1)在这上面浪费了几个小时。

在我的情况下,视图没有在xib中查看。在xib中,视图是size=no(第四个选项卡右手)。我将size设置为Freeform并重新加载xCode。视图被上诉,我设置了正确的链接到视图。

我在XCode 4.6.3中遇到了同样的问题。我从几个名为MySettingsView.h.m的文件开始,但删除了它们以支持MySettingsViewController.h,但是尽管尝试了这里提到的大多数提示,它仍然继续出错,

2013-07-05 11:48:17.205 MyApp[39024: c07]***由于未捕获的异常“NSInternalIn的不一致异常”而终止应用程序,原因:'-[UIViewController_loadViewFromNibNamed: bundle:]加载了"MySettinsView"nib但未设置视图出口。'

它显然仍然“困惑”,试图加载MySettingsView.xib而不是MySettinsView控制器.xib.也许它的“做我的意思”逻辑太花哨了。

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

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

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

右键单击xib的左窗格中的“File Owner”,然后验证“view”出口是否已设置。如果没有,请将其设置为视图!

这肯定会解决这个问题

对我来说,这里所说的所有事情https://stackoverflow.com/a/6395750/939501都是真的,但它仍然是抛出错误,原因是我创建了一个名为ABCView的View类,然后删除了它,后来我添加了一个视图控制器作为ABCViewController,所以不知何故,它在新的视图控制器中引用了旧的ABCView,我不得不删除ABCViewController并添加一个不同名称的新视图来解决我的问题。

谢了

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

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

我今晚遇到了一个非常相似的东西,一个Swift UIViewController子类。在这种情况下,上述修复都不起作用,但是稍微重新排序我的代码确实起作用了。净网,在同一个文件中,子类的扩展名出现在子类定义本身之前似乎会混淆XCode,尽管编译得很好;解决方法是将扩展名放在子类定义之后。

我已经发布了详细信息来回答这个类似的问题

这是乔希正义提案,但以图形方式(图片是我的):

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

输入图片描述

  1. 在右侧面板上选择oultets
  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];

对我来说,它发生了,当

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

  • 我们会这样称呼

    -(void)initCheckView{
    CheckView *pCheckViewCtrl = [CheckView instance];
    pCheckView = [pCheckViewCtrl view];
    [[self view]addSubview:pCheckView];
    [pCheckViewCtrl performCheck];
    }

Where

+(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不见了,,,添加这一行解决了我的问题。

在我的例子中,实现了***ViewController类中的指定初始化器- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil,因此即使我调用其他初始化器来初始化对象,指定的初始化器也会被调用。

因此,要解决这个问题,检查- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil也是一个正确的方法。

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

我也有同样的问题,我想通了,这是因为我在内容选项下的表视图属性中勾选了“静态细胞”。当它更改为“Dynamic Prototypes”时有效。截图如下。输入图片描述

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

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

前面的答案几乎为我解决了问题,但缺少最后一步。

  1. 创建一个同名的xib和swft文件。

添加视图和Swift文件

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

在此处输入图片描述

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

添加内容视图

  1. 添加此自定义初始化器,以便在xib加载时附加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.boundscontentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]}

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

干杯。李察

当你有一个用@objc引用不同命名空间的Swift代码时,一定要使用Objective-C类名:

@objc(NamespacedSomeViewController)class SomeViewController: UIViewController {....

在这种情况下,您需要在IB中使用NamespacedSomeViewController

打开你的故事板文件,你的viewController存在,或XIB相关的文件textEdit.app,并检查故事板或XIB名称是否与你的viewController相同,然后更改它,保存并重新加载/重新启动Xcode。

如果您使用的是自定义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;}

我的问题是在错误的类中。我使用自定义. xib作为我的自定义视图。正确地,它必须像这样设置:

  1. View不应该有阶级
  2. .xib一起使用的类设置在File's Owner选项卡中
  3. 插座连接到File's Owner而不是View

    pic

我遇到这个问题的方式与这里的其他答案略有不同。

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

灰色的查看出口

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