我有一个带有视图控制器根元素的笔尖,如下所示:
所以我可以使用自动布局相对于顶部和底部布局指南定位元素。
当我第一次尝试使用
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;
}
}];
这似乎在没有运行时崩溃的情况下工作。但是,除了干净的代码之外,一切都是如此。