我有一個視圖控制器根元件的筆尖這樣的:如何使用頂級ViewController加載XIB?
所以可以定位相對於使用自動佈局的頂部和底部導軌佈局元素。
當我第一次試圖加載使用
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
此筆尖,我得到了以下運行時異常:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'
Google上搜尋它向我指出錯誤,該文件所有者的xib需要設置爲我的視圖控制器的類,而視圖插座必須設置爲xib中的視圖對象。如果我這樣做,然後我得到以下運行時錯誤:
Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'
不令人感到意外,因爲該視圖關聯到兩個文件的所有者和筆尖的頂級視圖控制器。但是我怎麼能告訴運行時間他們實際上是兩個完全相同的東西,而不是兩個單獨的實體?
編輯: 當我嘗試從像這樣的筆尖unpck的視圖控制器,
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
,它確實沒有好或者:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ 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;
}
}];
這似乎工作沒有運行時崩潰。但是,它只是簡潔的代碼。
關於你的編輯..你在你的筆尖的錯誤。您需要確保班級名稱正確,並且必須手動斷開您所做的任何錯誤連接。你爲FilesOwner類設置了什麼?你對FilesOwner有什麼聯繫? – hooleyhoop
好吧,只要你意識到它會根據你是否[NSBundle mainBundle] loadNibNamed:...或SearchViewControllerPro alloc] initWithNibName:...因此你設置了FilesOwner類的任何連接如果您更改加載方法 – hooleyhoop