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

时间:2011-01-21 20:35:38

标签: ios cocoa-touch interface-builder xib

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

但是,当我点击应该带我到我创建的视图的工具栏图标时,我会收到NSInternalInconsistencyException的消息:

  

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

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

32 个答案:

答案 0 :(得分:1703)

你们是对的,但是因为我是新来者,我花了一点时间才弄清楚要做的所有步骤。这对我有用:

  • 打开导致问题的XIB文件
  • 点击左侧栏上的文件所有者图标(顶部的一个,看起来像一个黄色的方框)
  • 如果您没有看到右侧边栏,请单击工具栏中“视图”上方的第三个图标。这将显示右侧边栏
  • 在右侧边栏中,点击第三个标签 - 看起来有点像报纸的标签
  • 在顶部的“自定义类”下,确保Class是应与此视图对应的ViewController的名称。如果没有,请输入

Custom class configuration

  • 在右侧边栏中,点击最后一个标签 - 看起来像一个带箭头的圆圈
  • 你应该看到“outlet”下面有“view”。将旁边的圆圈拖到左侧栏上的“视图”图标(底部的一个,看起来像一个带有粗灰色轮廓的白色方块)

Custom class configuration

  • 保存xib并重新运行

答案 1 :(得分:162)

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

  1. 选择文件所有者
  2. 在右侧面板上选择自定义类。
  3. 输入自定义班级名称
  4. enter image description here

    1. 在右侧面板上选择oultets
    2. 拖动视图插座以查看组件
    3. enter image description here

      最后,使用滚动代码实例化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,尽管编译正常;修复是将扩展放在子类的定义之后。

我已发布详情in an answer to this similar question

答案 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)

对我而言,发生时,

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

答案 22 :(得分:0)

我想第二个Stephen J.有时X Code会让人感到困惑。我刚刚有过一次体验,我曾经玩过很多UI,并且已经添加和删除了很多次。这些网点不再接线了。我从来没有弄清楚具体的原因(我已经尝试了上面的所有解决方案),我只需要删除NIB并从头开始重新创建它,事实上它必须在它工作之前使用不同的NIB名称。 (XCode 4.6.1)浪费了几个小时。

答案 23 :(得分:0)

我有同样的问题,我想通了,这是因为我勾选了#34; 静态细胞"在内容选项下的表格视图属性中。工作时更改为" Dynamic Prototypes"。屏幕截图如下。  enter image description here

答案 24 :(得分:0)

选择文件所有者并转到打开身份检查器,给出与其对应的类名。如果上述方法都不起作用,仍然无法看到视图插座,则将新的参考插座连接到文件所有者,然后您就可以看到视图插座。单击视图插座以在View Outlet和File的所有者之间建立连接。运行应用程序这很好。

答案 25 :(得分:0)

我遇到了与Xcode 9.3类似的问题,并设置了"模块"在"文件所有者""属性检查员到项目模块为我修复了这个。

答案 26 :(得分:0)

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

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

Add View and Swift File

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

enter image description here

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

add the contentview

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

add the contentview as a subview

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用于自定义视图。 正确地,它必须设置如下:

  1. 视图不应包含类
  2. .xib一起使用的类在File's Owner标签中设置
  3. 插座连接到File's Owner,而不连接到View

    pic

答案 31 :(得分:0)

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

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

the greyed-out View outlet

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