2013-04-01 68 views
1

StoryBoard setup如何實例化自定義iOS UIViewController並在Storyboard下使用它的NIB?

我有一個StoryBoard(iOS 5+)項目,有兩個UIViewController。

該任務將以編程方式實例化第二個UIViewController(CoordinationController),但是我想將它的XIB文件用於用戶界面設計。

將XIB複製到StoryBoard中的顯而易見的解決方法由於無證件原因而不起作用或不可用。 即使規則是,如果第二個故事板的視圖控制器沒有視圖,它會尋找同名的XIB ...不起作用。

如何實例化第二個UIViewController並使用它的XIB文件?

回答

4

您可以加載筆尖文件,並設置在的initWithCoder你的觀點:CoordinationController的方法:

-(id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     UINib *nib = [UINib nibWithNibName:@"CoordinationController" bundle:nil]; 
     NSArray *nibObjects = [nib instantiateWithOwner:self options:nil]; 
     self.view = nibObjects.lastObject; 
    } 
    return self; 
} 
+0

沒關係,謝謝,但我想看看FirstViewController的實例化。只是一個額外的問題:它可以與segue一起工作嗎? – BootMaker

+0

@BootMaker,我不明白你的意思。 FirstViewController也是CoordinationController的子類嗎? – rdelmar

+0

不,它是一個不同的控制器,實際上是第一個控制器或RootController,但它很重要,它如何實例化CoordinationController。 – BootMaker

5

一個非常簡單的解決方案是重寫視圖控制器的nibName財產和返回筆尖編碼的名稱認爲你想裝:

- (NSString*) nibName 
{ 
    NSLog(@"p.s. this is the nib that the storyboard generated: %@", [super nibName]); 

    return @"MyViewController"; 
} 

注意,您可以訪問由故事板編譯器生成的筆尖,這將已經使用的名稱。該筆尖包含在應用程序包中,並打包在storyboard.storyboardc包中。

我有些驚訝,你不能從這個nibName實現返回nil,並得到加載程序使用rules described in the docs搜索nib的默認行爲。

或者(這是作弊),您可以通過用戶定義的運行時屬性和鍵名nibName在視圖控制器的故事板本身中設置所需的nib名稱。這是有效的,因爲有一個沒有記錄的二傳手,所以不要這樣做!

我認爲這是比接受的答案更好的解決方案,因爲視圖將在視圖控制器的生命週期的正常過程中加載 - 也就是說,它將在控制器呈現之前延遲加載, init方法。這是更少的代碼。

+0

我有一個問題,我需要顯示多個.xibs,但只使用一個視圖控制器。我用這個和一個單身人士解決了它。 .xib名稱在singleton屬性NSString * xibName中設置。然後視圖控制器從故事板實例化。內部 - (NSString *)nibName我添加了一行並返回了xibName。完美工作。 –

相關問題