我在项目中添加了一个新的nib文件,并尝试加载它。
但是,当我点击应该带我到我创建的视图的工具栏图标时,我会收到NSInternalInconsistencyException
的消息:
由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载了“...”笔尖,但未设置视图插座。'
所以我打开了我的nib文件,我看到该视图没有设置引用插座。但是,我尝试单击并将“新引用插座”的圆圈拖动到文件所有者,但它不会让我...我需要做什么才能显示我的视图?
答案 0 :(得分:1703)
你们是对的,但是因为我是新来者,我花了一点时间才弄清楚要做的所有步骤。这对我有用:
答案 1 :(得分:162)
这是Josh Justice的建议,但是以图形的方式(图片是我的):
最后,使用滚动代码实例化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];
答案 2 :(得分:67)
我通常可以通过重置File的Owner和视图之间的连接来解决它。按住Ctrl键并从文件所有者拖动到视图(在IB中),然后从弹出菜单中选择视图。
答案 3 :(得分:59)
未设置View Identity - Class Identity。将其设置为适当的类后,问题就解决了。
答案 4 :(得分:27)
你确定你有一个UIView(或子类)分配给你的ViewController的“view”属性吗?
右键单击xib左侧窗格中的“文件所有者”,查看yourViewController并验证是否设置了“视图”插座。 如果没有,请将其设置为视图!
这将明确解决问题
答案 5 :(得分: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];
}
答案 6 :(得分:13)
对我来说,https://stackoverflow.com/a/6395750/939501所述的所有内容都是正确的,但仍然是抛出错误,原因是我创建了一个名为ABCView的View类,然后将其删除后我添加了一个视图控制器作为ABCViewController,所以不知何故它是在新的视图控制器中引用旧的ABCView,我不得不删除ABCViewController并添加一个具有不同名称的新的解决了我的问题。
由于
答案 7 :(得分:6)
我的问题是由于类文件夹中没有视图集的重复nib引起的。 xcode似乎在为构建选择一个笔尖,然后在下次构建项目时选择另一个笔尖。刚刚删除了另一个。看起来不错。卫生署!
答案 8 :(得分:5)
对于使用xib方法创建UIView并遇到此问题的任何人,您会注意到您没有获得"视图"连接检查员菜单下的插座。但是,如果您将文件的所有者自定义类设置为UIViewController,那么您将看到"视图"插座,您可以通过CMND将插座连接到CustomView。
答案 9 :(得分:4)
我刚把它修好了。大项目,两个文件。一个是“ReallyLargeNameView”,另一个是“ReallyLargeNameViewController”
根据上面选择的第二个答案,我决定要清理我的构建。 Nada,但我仍然怀疑XCode(因为我有两个相同的类,应该抽象它们但是......)所以一个人正在工作,一个人没有。文件的所有者名称是复制和粘贴,插座重新挂起,xCode重新启动,仍然没有。
所以我删除了类似的命名类(这是一个视图)。很快,新的错误“插座内部没有连接”字面上是“webView不是键值”等等......基本上说“Visual Studio更好”。无论如何...我删除了较小的命名文件,而bam,它可以工作。
XCode被类似命名的文件搞糊涂了。而且该项目足够大,需要重新启动,这可能是其中的一部分。
希望我有一个比“XCode感到困惑”更为技术性的答案,但是,xCode在这一点上变得很混乱。像我帮助一个小孩一样解除困惑。它现在有效,:)如果上面没有解决任何问题,应该让其他人受益。
始终记得清理你的版本(通过删除模拟器)
答案 10 :(得分:4)
花了一个多小时试图找出为什么我的视图属性在从nib启动时没有在我的视图控制器中设置。记得在视图控制器的initWithNibName中调用“[super initWithNibName ...]”。
答案 11 :(得分:3)
我在意外删除xib引用时遇到了同样的问题并再次添加它。我只是通过在Files owner和view之间建立连接来修复。还要确保你的FilesOwner自定义类是你期望的viewController。 / p>
答案 12 :(得分:3)
我也有同样的问题,我的问题是我在ViewControllers笔尖中添加了其他本地化(英文),所以我的本地化德语应用程序无法找到本地化英语的笔尖!希望这有助于任何人!
答案 13 :(得分:1)
我遇到了同样的问题,但需要稍微不同的解决方案。这种情况下的问题是文件所有者的类,而不是视图的类。要设置它,我必须单击Interface Builder窗口左下角的“向后播放”图标,然后出现选项,隔离文件所有者,第一响应者和视图的特征。单击第一个(大透明框),我可以按照上面的建议设置自定义类。
答案 14 :(得分: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;
}
答案 15 :(得分:1)
在我的情况下,*** ViewController类中的指定初始化程序- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
已实现,因此即使我调用其他初始化程序初始化对象,也会调用指定的初始化程序。
所以要解决这个问题,检查- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
也是一种正确的方法。
答案 16 :(得分:1)
我今晚遇到了一个非常相似的东西,有一个Swift UIViewController子类。在这种情况下,上述修复都没有奏效,但重新排序了我的代码。 Net-net,子类的扩展发生在子类的定义本身在同一个文件中似乎混淆了XCode,尽管编译正常;修复是将扩展放在子类的定义之后。
答案 17 :(得分:1)
对我来说,问题是由致电initWithNibName:bundle:
引起的。我正在使用来自nib文件的表格视图单元格来定义tableViews
上的条目表单。因为我没有观点,所以挂钩到一个没有意义。相反,如果我改为调用initWithStyle:
方法,并从那里调用,我会加载nib文件,然后按预期工作。
答案 18 :(得分:1)
我遇到了同样的问题,但需要一个不同的解决方案。这种情况下的问题是文件所有者的类没有连接到xib文件。
答案 19 :(得分:0)
如果您已经尝试了所有内容并且仍然遇到此错误,请尝试从头开始重新创建类文件,但请记住选择"还要创建XIB文件"复选框。这将在单独创建这些文件时自动链接一些未链接的项目。在创建之后,您可以将所有内容剪切并粘贴到新的XIB上,它应该可以正常工作。
我发现这个问题特别是在Swift中单独创建文件。
答案 20 :(得分:0)
在我的情况下,视图没有在xib中查看。 在xib中,View是size = none(右手第4个选项卡)。我将大小设置为Freeform并重新加载xCode。 视图被上诉,我设置了正确的链接。
答案 21 :(得分:0)
对我而言,发生时,
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 ,,添加此行解决了我的问题。
答案 22 :(得分:0)
我想第二个Stephen J.有时X Code会让人感到困惑。我刚刚有过一次体验,我曾经玩过很多UI,并且已经添加和删除了很多次。这些网点不再接线了。我从来没有弄清楚具体的原因(我已经尝试了上面的所有解决方案),我只需要删除NIB并从头开始重新创建它,事实上它必须在它工作之前使用不同的NIB名称。 (XCode 4.6.1)浪费了几个小时。
答案 23 :(得分:0)
答案 24 :(得分:0)
选择文件所有者并转到打开身份检查器,给出与其对应的类名。如果上述方法都不起作用,仍然无法看到视图插座,则将新的参考插座连接到文件所有者,然后您就可以看到视图插座。单击视图插座以在View Outlet和File的所有者之间建立连接。运行应用程序这很好。
答案 25 :(得分:0)
我遇到了与Xcode 9.3类似的问题,并设置了"模块"在"文件所有者""属性检查员到项目模块为我修复了这个。
答案 26 :(得分:0)
以前的答案几乎为我解决了这个问题,但最后一步却不见了。
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。
干杯, 理查德
答案 27 :(得分:0)
当您有一个使用@objc
引用不同名称空间的Swift代码时,请确保使用Objective-C类名称:
@objc(NamespacedSomeViewController)
class SomeViewController: UIViewController {
....
在这种情况下,您需要在IB中使用NamespacedSomeViewController
。
答案 28 :(得分:0)
打开您的viewController所在的故事板文件,或使用 textEdit.app 打开 XIB 相关文件,并检查故事板或XIB名称是否为与viewController相同,然后对其进行更改,保存并重新加载/重新启动Xcode。
答案 29 :(得分:0)
我的项目中遇到了同样的错误,但原因不同。在我的例子中,我的自定义UITableViewController类中有一个名为“View”的IBOutlet设置。我知道“视图”很特别,因为它是基类的成员,但我不认为View(不同的情况)也是一个问题。我猜Cocoa的某些区域不区分大小写,并且可能加载xib是其中一个区域。所以我只是将它重命名为DefaultView,现在一切都很好。
答案 30 :(得分:0)
我的问题是在错误的课堂上。我将自定义.xib用于自定义视图。 正确地,它必须设置如下:
答案 31 :(得分:0)
我遇到的问题与这里的其他答案略有不同。
如果我只是简单地创建了一个新的xib文件,则在Interface Builder中向其中添加了一个UIViewController,并将该UIViewController的自定义类设置为我的视图控制器,这导致“未设置视图出口”崩溃。这里的其他解决方案是将视图出口控制拖动到View,但是对我来说,视图出口是灰色的,我无法对其进行控制拖动。
我发现我的错误是在Interface Builder中添加UIViewController。相反,我必须添加一个UIView,并将文件所有者的自定义类设置为我的视图控制器。然后,我可以控制将文件所有者的视图出口拖到我的新视图UIView中,一切都会正常进行。