【发布时间】:2013-09-30 20:40:29
【问题描述】:
我有一个这样的视图控制器根元素的笔尖:
所以我可以使用自动布局相对于顶部和底部布局指南定位元素。
当我第一次尝试加载这个笔尖时
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
我得到了以下运行时异常:
由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“SearchViewControllerPro”笔尖,但未设置视图出口。'
谷歌搜索它向我指出的错误,需要将 xib 的文件所有者设置为我的视图控制器的类,并且必须将视图出口设置为 xib 中的视图对象。如果这样做,则会收到以下运行时错误:
由于未捕获的异常而终止应用程序 'UIViewControllerHierarchyInconsistency',原因:'一个视图只能是 一次最多关联一个视图控制器!视图 > 与 关联。在将此视图与关联之前清除此关联 .'
这并不奇怪,因为视图与文件所有者和 nib 的顶级视图控制器相关联。但是我如何才能告诉运行时它们实际上是同一事物而不是两个独立的实体?
编辑: 当我尝试像这样从笔尖解压 ViewController 时,
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
,它也没有好处:
由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[setValue:forUndefinedKey:]: 这个类 不符合键视图的键值编码。
临时解决方案:
我找到了一个解决方案,但它并不漂亮。尽管结构如 IB 所示,但视图控制器并不是 xib 中的最后一个对象。所以我有:
__block SearchViewControllerPro* mapSearchViewController = nil;
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[SearchViewControllerPro class]]) {
mapSearchViewController = obj;
}
}];
这似乎在没有运行时崩溃的情况下工作。然而,除了干净的代码之外,一切都是如此。
【问题讨论】:
-
关于您的编辑..您的笔尖有错误。您需要确保类名称是正确的,并且您必须手动断开您所做的任何不正确的连接。您将什么设置为 FilesOwner 类?您与 FilesOwner 建立了哪些联系?
-
好吧,不管你将 FilesOwner 类设置成什么,只要你意识到它会根据你是否执行 [NSBundle mainBundle] loadNibNamed:... 或 SearchViewControllerPro alloc]initWithNibName: ...因此,如果您更改加载方法,您与 FilesOwner 建立的任何连接都将无效(您将崩溃)
标签: ios uiview uiviewcontroller interface-builder xib