我有一个带有视图控制器根元素的 nib,像这样:
我遇到了以下运行时异常:
终止应用程序,因为未捕获的异常 'NSInternalInconsistencyException',原因是:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“SearchViewControllerPro”nib,但视图输出口未设置。'
通过搜索错误信息,我发现需要将xib文件的文件所有者设置为我的视图控制器类,并将视图输出口设置为xib中的视图对象。如果这样做,那么我会得到以下运行时错误:
终止应用程序,因为未捕获的异常 'UIViewControllerHierarchyInconsistency',原因是:'一个视图只能与一个视图控制器关联! 视图>与关联。在将此视图与之关联之前,请清除此关联。'
这并不令人惊讶,因为该视图同时与xib的文件所有者和顶级视图控制器相关联。但是,我如何告诉运行时它们实际上是同一件事情,而不是两个单独的实体?
编辑: 当我尝试从nib中解压缩ViewController时,如下所示:
因此,我可以使用自动布局相对于顶部和底部布局指南定位元素。
当我第一次尝试使用以下方式加载此 nib 时:
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
我遇到了以下运行时异常:
终止应用程序,因为未捕获的异常 'NSInternalInconsistencyException',原因是:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“SearchViewControllerPro”nib,但视图输出口未设置。'
通过搜索错误信息,我发现需要将xib文件的文件所有者设置为我的视图控制器类,并将视图输出口设置为xib中的视图对象。如果这样做,那么我会得到以下运行时错误:
终止应用程序,因为未捕获的异常 'UIViewControllerHierarchyInconsistency',原因是:'一个视图只能与一个视图控制器关联! 视图>与关联。在将此视图与之关联之前,请清除此关联。'
这并不令人惊讶,因为该视图同时与xib的文件所有者和顶级视图控制器相关联。但是,我如何告诉运行时它们实际上是同一件事情,而不是两个单独的实体?
编辑: 当我尝试从nib中解压缩ViewController时,如下所示:
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
它也毫无用处:
由于未捕获的异常“NSUnknownKeyException”,应用程序终止, 原因:'[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view。
临时解决方案:
我找到了一个解决方法,但它不太好看。尽管在IB中显示的结构如此,但视图控制器不是xib中的最后一个对象。 所以我有:
__block SearchViewControllerPro* mapSearchViewController = nil;
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[SearchViewControllerPro class]]) {
mapSearchViewController = obj;
}
}];
这样做似乎可以避免运行时崩溃。但是,这并不是干净的代码。