2012-10-16 76 views
3

我想知道,如果有人可以解釋(或點我在正確的方向)UIWindow在哪裏實例化並且故事板傳入?

  1. 其中用於實例化的UIWindow代碼消失後當不使用故事板?在空應用程序項目模板中,該窗口在AppDelegate中的應用程序didFinishLaunnching ...中創建。

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    

    但是,如果使用故事板,上面的代碼被省略,但顯然UIApplication知道哪個窗口開始。

  2. 其中應用程序查找info.plist文件以知道哪些故事板開始。

我敢肯定,這是所有有據可查的地方,我只是沒有找到它。閱讀Where is the UIWindow instantiated in an iPhone app?但沒有太大的幫助。我已經在iOS上呆了一段時間,直到現在,從來沒有必要混淆應用程序的初始啓動。謝謝

回答

7

我認爲你的意思是'代碼消失到你使用故事板時'。

應用程序根據Info.plist中的「主故事板文件基名」(UIMainStoryboardFile)鍵加載故事板,並從該故事板中通過「初始視圖控制器」切換集加載視圖控制器。

編輯:要求在評論,下面的代碼(類似於基於XIB-應用的初始加載)將允許您加載並在應用程序啓動的名字顯示情節提要:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil]; 
    UIViewController *viewController = [storyboard instantiateInitialViewController]; 
    self.window.rootViewController = viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

我我會改寫,如何在運行時以編程方式更改初始故事板?如果我創建了一個空的非故事板應用程序,我可以通過1.創建一個,添加故事板2.添加Info.plist的關鍵,然後3.刪除appDelegate中的窗口分配代碼..但是,我將如何分配一個不同的故事板基於應用程序加載時的任何內容? – Patrick

+0

這就是你應該在你的視圖控制器中做的事情,你有什麼理由要在應用程序啓動時有條件地加載不同的故事板?無論如何,我花了一些時間,並設法弄清楚如何做到這一點,我相應地編輯了這個問題。 – ttarik

0

使用故事板時,要加載的故事板來自應用的Info.plist文件。

有會在你Info.plist文件與鍵值對這樣的一個部分:

<key>UIMainStoryboardFile</key> 
    <string>MainStoryboard</string> 

在這種情況下,MainStoryboard是加載默認的故事板的名稱。