如何使用顶级ViewController加载XIB?

Chr*_*ris 7 interface-builder xib uiviewcontroller uiview ios

我有一个带有视图控制器根元素的笔尖,如下所示:

在此输入图像描述

所以我可以使用自动布局相对于顶部和底部布局指南定位元素.

当我第一次尝试使用时加载此笔尖

SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
Run Code Online (Sandbox Code Playgroud)

我得到以下运行时异常:

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

谷歌搜索我指出的错误,需要将xib的文件所有者设置为我的视图控制器的类,并且必须将视图出口设置为xib中的视图对象.如果我这样做,那么我得到以下运行时错误:

由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'视图一次只能与一个视图控制器关联!视图>与...相关联.在将此视图与.关联之前清除此关联.

由于视图与文件所有者和nib的顶级视图控制器相关联,因此不会令人感到意外.但是,我怎么能告诉运行时它们实际上是同一个东西而不是两个独立的实体呢?

编辑: 当我尝试从nib中取消ViewController时,如此

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
Run Code Online (Sandbox Code Playgroud)

,它也没有好处:

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是键视图的键值编码兼容.

临时解决方案:

我找到了一个解决方案,但它并不漂亮.尽管IB中显示了结构,但视图控制器不是xib中的最后一个对象.所以我有:

__block SearchViewControllerPro* mapSearchViewController = nil;
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[SearchViewControllerPro class]]) {
        mapSearchViewController = obj;
    }
}];
Run Code Online (Sandbox Code Playgroud)

这似乎没有运行时崩溃.但是,它只是干净的代码.

hoo*_*oop 4

我如何告诉运行时它们实际上是同一件事而不是两个单独的实体?

你不能,因为它们不是同一件事。您已经创建了两个SearchViewControllerPro实例。

您需要分配初始化 SearchViewControllerPro 实例或从笔尖取消存档一个实例。

如果您决定在 nib 中创建 ViewController,则访问它的通常方法与访问在 nib 中创建的任何其他项目(视图、按钮、文本字段)相同。

将插座添加到 FilesOwner 对象,在界面生成器中连接连接,并确保在取消归档笔尖时传递该对象。

例如,如果您希望取消归档笔尖的对象是 FilesOwner:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil];
Run Code Online (Sandbox Code Playgroud)

  • 让我重新表述一下这个问题:我知道如何将笔尖作为视图加载到“UIViewController”中。由于对于 iOS7,我需要相对于 topLayoutGuide 重新定位元素,因此我必须将视图控制器作为顶级元素放在笔尖中,并且到目前为止我加载它的尝试都失败了。您正确地描述了症状 - 由于笔尖的结构以及我尝试实例化视图控制器的方式,我得到了两个对象。但我不知道如何设置笔尖和加载调用,所以我最终只有一个。我希望这能更好地解释它。 (2认同)