2013-09-25 134 views
7

我有一個視圖控制器根元件的筆尖這樣的:如何使用頂級ViewController加載XIB?

enter image description here

所以可以定位相對於使用自動佈局的頂部和底部導軌佈局元素。

當我第一次試圖加載使用

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; 
    } 
}]; 

這似乎工作沒有運行時崩潰。但是,它只是簡潔的代碼。

+0

關於你的編輯..你在你的筆尖的錯誤。您需要確保班級名稱正確,並且必須手動斷開您所做的任何錯誤連接。你爲FilesOwner類設置了什麼?你對FilesOwner有什麼聯繫? – hooleyhoop

+0

好吧,只要你意識到它會根據你是否[NSBundle mainBundle] loadNibNamed:...或SearchViewControllerPro alloc] initWithNibName:...因此你設置了FilesOwner類的任何連接如果您更改加載方法 – hooleyhoop

回答

4

how can I tell the run-time that they are both in fact the very same thing instead of two separate entities?

你不能因爲他們不是一回事。您已創建兩個SearchViewControllerPro實例。

你需要alloc-init一個SearchViewControllerPro實例或從一個nib中取消存檔。

如果您決定在筆尖中創建ViewController,通常訪問它的方式與訪問您在筆尖中創建的任何其他項目(視圖,按鈕,文本字段)的方式相同。

向FilesOwner對象添加一個插座,在接口構建器中掛接連接,並確保在解除對該筆尖的存檔時傳遞該對象。

例如,如果希望解檔筆尖是FilesOwner對象:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

感謝您的回答,使FilesOwner將無效(您將崩潰)。雖然我不確定我是否理解。我只是試圖從筆尖內部獲取''ViewController'',但在那裏沒有運氣(參見上面的編輯,是什麼意思?)。關於你的評論:是的,我現在知道,我有兩個實例。我想說的是,我想將它們解析爲同一個對象,並且不知道如何在IB或代碼中執行該操作,因爲alloc-initing失敗(請參見上面的錯誤)。 – Chris

+0

「將兩個實例解析爲同一個對象」意味着什麼?如果我這樣做:ob1 = [SearchViewControllerPro alloc] init]; ob2 = [SearchViewControllerPro alloc] init]; (這就是你所做的)我將如何解決它們到一個實例?兩個對象是兩個對象。 – hooleyhoop

+2

讓我重新說明這個問題:我知道如何將一個筆尖作爲一個視圖加載到一個「UIViewController」中。因爲對於iOS7我需要重新定位相對於topLayoutGuide的元素,所以我必須將視圖控制器作爲頂級元素放置在筆尖中,而我迄今爲止加載它的嘗試都失敗了。您正在描述症狀 - 由於筆尖的結構和我嘗試實例化視圖控制器的方式,我得到兩個對象。但我不知道要設置筆尖和加載電話,以便最終只有一個。我希望能更好地解釋它。 – Chris

3

以下工作以及和(至少對我來說)是一個小更明確,創建了視圖控制器的插座:

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

儘管此代碼可能有助於解決問題,但它並不解釋_why_和/或_how_它的答案這個問題。提供這種附加背景將顯着提高其長期教育價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –

相關問題