ChatGPT解决这个技术问题 Extra ChatGPT

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

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

但是,当我单击应该将我带到我创建的视图的工具栏图标时,我会收到带有以下消息的 NSInternalInconsistencyException

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

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

尝试先清理构建。
我的情况是,真正的错误是我在 viewController (- (void) setValue:(NSNumber*)value forKey:(NSString*) key) 中定义了一个方法,它覆盖了导致错误的 ViewController 方法。我解决了重命名此方法

N
Nimantha

这对我有用:

打开导致问题的 XIB 文件

单击左侧栏上的文件所有者图标(顶部一个,看起来像一个黄色轮廓框)

如果您没有看到右侧边栏,请单击工具栏中“视图”上方的第三个图标。这将显示右侧边栏

在右侧边栏中,单击第四个选项卡——看起来有点像报纸的选项卡

在顶部的“自定义类”下,确保 Class 是应与该视图对应的 ViewController 的名称。如果没有,请输入

在右侧边栏中,单击最后一个选项卡 - 看起来像一个带有箭头的圆圈

您应该在其下方看到带有“视图”的“出口”。将旁边的圆圈拖到左侧栏上的“查看”图标(底部一个,看起来像一个带有粗灰色轮廓的白色正方形

保存xib并重新运行


我在可可上也遇到了这个问题,只要视图没有加载/添加到视图层次结构中,所有视图出口都是 NIL。在调用 addSubview 或类似的东西后,所有插座都已连接。我的故事中有趣的部分是 po viewcontroller.view.subviews 显示了丢失的对象。
从第 4 步和第 5 步开始,此解决方案不再适用于 Xcode 7.3。相反,在界面生成器中,从 File 的所有者按住 Control 并拖动到您的 View 。
对我不起作用(连接检查器中没有插座部分,因此在要连接的插座下没有“视图”),但为您在答案中付出的努力 +1。 :)
如果您在插座中看不到“视图”,您还可以从文件所有者 ctlr 拖动到情节提要上的视图。上下文菜单应带有“查看”选项
@WilliamT.Mallard 我也有同样的行为。 MyViewControllerUIViewController 的子类的子类,“Outlets”下没有 view。如果我直接从 UIViewController 子类 MyViewController,则视图出现在“Outlets”下。 Xcode 的魔法或错误。
J
Javier Calatrava Llavería

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

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

https://i.stack.imgur.com/h5Ifi.jpg

在右侧面板上选择 ultets 拖动视图插座以查看组件

https://i.stack.imgur.com/fzu7d.jpg

最后使用滚动代码实例化视图控制器:

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

我错过了第五步
R
Rohit Mandiwal

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


J
John

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


嗨@John,我已经这样做了,但仍然遇到这个异常。
B
Bhavin Bhadani

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

右键单击您的ViewController 的xib 左侧窗格中的“文件所有者”,并验证“视图”出口是否已设置。如果没有,请将其设置为视图!

这肯定会解决问题


清晰,简洁的答案。
C
Community

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

谢谢


2020年仍然是一个错误。
H
Hardik Thakkar

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

B
Brian Kendig

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

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

https://i.stack.imgur.com/4MTnv.png

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


m
manapate

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


惊人的。太感谢了。这应该是一个公认的答案!
M
Matt

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


K
Kamil.S

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


S
Stephen J

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

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

所以我删除了类似的命名类(这是一个视图)。很快,新错误“outlet inside not hook up”字面意思是“webView not key value”等等……基本上是说“Visual Studio 更好”。无论如何...我删除了较小的命名文件,然后bam,它可以工作。

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

希望我有一个比“XCode 很困惑”更技术性的答案,但是,xCode 在这一点上很困惑。就像我帮助一个小孩一样,不要混淆它。它现在可以工作了,:) 如果上述方法不能解决任何问题,它应该使其他人受益。

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


C
COSMO BAKER

以前的答案几乎为我解决了这个问题,但最后一步不见了。

创建一个同名的 xib 和 swift 文件。

https://i.stack.imgur.com/pj2Uw.png

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

https://i.stack.imgur.com/8lsOD.png

将一个插座从视图拖到 UIView 子类,将其命名为“contentView”

https://i.stack.imgur.com/YPQ7C.jpg

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

https://i.stack.imgur.com/sONPh.png

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 都将被附加。

干杯,理查德


W
Weini

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


N
Nidhin

我在意外删除 xib 引用并再次添加时遇到了同样的问题。我只是通过在文件所有者和视图之间建立连接来修复它。此外,请确保您的 FilesOwner 的自定义类是您预期的 viewController。


B
Bill the Lizard

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


M
Michael Stern

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


u
user1951454

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


C
Community

今晚我遇到了非常相似的事情,它带有一个 Swift UIViewController 子类。在这种情况下,上述修复均无效,但稍微重新排序我的代码就可以了。 Net-net,子类的扩展出现在同一个文件中的子类定义本身之前,这似乎使 XCode 感到困惑,尽管编译得很好;解决方法是将扩展放在子类的定义之后。

我已经发布了详细信息 in an answer to this similar question


l
lynulzy

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

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


E
Eridana

我的问题是在错误的课程中。我将自定义 .xib 用于我的自定义视图。正确地,它必须像这里一样设置:

视图不应具有与 .xib 一起使用的类 设置在文件所有者选项卡中的插座连接到文件所有者而不是视图。


e
eselk

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


A
Abhilash Reddy kallepu

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


O
OrdoDei

就我而言,未在 xib 中查看该视图。在 xib 中,视图是 size = none (右侧第 4 个选项卡)。我将大小设置为自由格式并重新加载 xCode。视图被上诉,我将正确的链接设置为视图。


T
Travis M.

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

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


B
Bhavin Bhadani

对我来说它发生了,当

我有一个与 Nib 文件关联的 ViewController 类( .mm/h ),

来自这个 ViewController 的 UIView 必须作为子视图加载到另一个视图上,

我们将调用这样的东西 -(void)initCheckView{ CheckView *pCheckViewCtrl = [CheckView instance]; pCheckView = [pCheckViewCtrl 视图]; [[自我视图]addSubview:pCheckView]; [pCheckViewCtrl 执行检查]; }

在哪里

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


S
Saranjith

https://i.stack.imgur.com/v44k3.png


n
nananta

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


A
Alessandro Ornano

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


D
Declan Land

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