2012-07-01 37 views
2

要知道的重要事項我猜是我正在使用故事板。我做在didFinishLaunchingWithOptions以下:故事板 - initWithCoder被調用兩次

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"]; 
SecondView *tvc = [sb instantiateViewControllerWithIdentifier:@"SecondView"]; 

NSArray* controllers = [NSArray arrayWithObjects:[self addNavigationToViewController:mvc], [self addNavigationToViewController:tvc], nil]; 

// add controllers to a table view 
UITabBarController *tb = [[UITabBarController alloc] init]; 
[tb setViewControllers:controllers]; 

[self.window setRootViewController:tb]; 

addNavigationToViewController是我使用以嵌入一個UINavigationController

內部的視圖控制器的方法當運行此應用程序initWithCoderFirstView被調用兩次。我找到了原因,但我不知道如何以正確的方式做到這一點。

基本上的firstView是越來越由於它是初始場景初始化一次(有在屬性檢查員,設置視圖的複選標記「在初始視圖控制器」)和第二時間:

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"]; 

如果我取消選中初始場景它會抱怨「可能指定的入口點未設置」。

我做錯了什麼,但我不知道它是什麼。

任何提示,將不勝感激。

+0

我有完全相同的問題...雖然我從來沒有調用「instantiateViewControllerWithIdentifier」方法。我正在使用「純」故事板(例如,沒有在源代碼中實例化控制器)。任何想法爲什麼「initWithCoder」方法被調用兩次? – CedX

回答

4

在使用故事板的應用程序中,在應用程序啓動時,UIKit將在信息列表中查找the UIMainStoryboardFile key。如果設置了UIKit引用該故事板並使用 - [UIStoryboard instantiateInitialViewController]來創建一個默認的根視圖控制器來附加到窗口。

UIKit正在這樣做,然後在-didFinishLaunchingWithOptions:中,您還在創建視圖控制器的新實例。這就是它被實例化兩次的原因。

如果您想完全自定義此過程,並且看起來像您這樣做,那麼您可能不希望UIKit代表您執行這些默認操作。你可以簡單地從你的info.plist中刪除UIMainStoryboardFile鍵(S),並在-didFinishLaunchingWithOptions的覆蓋:,您可以:

  1. 創建一個窗口
  2. 抓住故事板
  3. 實例化視圖控制器( s)從故事板。
  4. 設置窗口的根視圖控制器。
  5. 使窗口鍵和可見。
+0

這是有道理的。謝謝 – yacana

0

除非您提到的內容超出您的理由,否則根本不需要撥打instantiateViewControllerWithIdentifier。如果您正在使用故事板,在大多數情況下,您可以(應該)在故事板中定義您的UITabBarController的視圖控制器,並讓您的MainTabBarController成爲您的「初始視圖控制器」。您還可以將視圖控制器嵌入到故事板中的導航控制器中。

+0

部分屬實。我可以做任何事情,但應該有一個有效的方式來處理代碼。故事板很不錯,但我喜歡它們,因爲它們將UI內容保存在一個地方。你的回答給了我一個想法,然後我會嘗試下一步。謝謝 – yacana