繁体   English   中英

已加载笔尖但未设置“查看”插座

[英]Loaded nib but the 'view' outlet was not set

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

但是,当我单击应该带我进入我创建的视图的工具栏图标时,我收到一个NSInternalInconsistencyException消息:

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

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

以下是对我有用的内容:

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

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

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

在此处输入图片说明

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

在此处输入图片说明

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

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

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

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

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

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

这将明确解决问题

我在 XCode 4.6.3 上遇到了同样的问题。 我一开始使用了几个名为MySettingsView.h.m文件,但为了支持MySettingsViewController.h删除了它们,但是尽管尝试了这里提到的大部分提示,它仍然不断出错,

2013-07-05 11:48:17.205 MyApp[39024:c07] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“MySettingsView”nib 但视图插座没有设置。

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

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

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

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

谢谢

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

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

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

灰色的 View 插座

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

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

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

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

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

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

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

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

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

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

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

添加视图和 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.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

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

干杯,理查德

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

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

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

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

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

今晚我遇到了非常相似的事情,使用 Swift UIViewController 子类。 在这种情况下,上述修复均无效,但对我的代码进行了一些重新排序。 Net-net,在同一文件中的子类定义本身之前发生子类的扩展似乎混淆了 XCode,尽管编译良好; 解决方法是将扩展放在子类的定义之后。

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

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

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

我的问题出在错误的课程上。 我使用自定义 .xib 作为我的自定义视图。 正确地它必须像这样设置:

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

    图片

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

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

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

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

我在 Swift 中单独创建文件时发现了这个问题。

对我来说它发生了,当

  • 我有一个与 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,添加这一行解决了我的问题。

我遇到了同样的问题,我想通了,这是因为我在内容选项下的表视图属性中勾选了“静态单元格”。 当它更改为“ Dynamic Prototypes ”时Dynamic Prototypes 截图如下。 在此处输入图片说明

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

打开 viewController 所在的故事板文件,或使用textEdit.app 的XIB相关文件,并检查故事板或 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;
}

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

当您有一个使用@objc引用不同名称空间的Swift代码时,请确保使用Objective-C类名称:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM