2013年9月2日 星期一

iOS-storyboard

整理一下storyboard如何載入以及storyboard與ios的關係

1. 一般Xcode載入流程:

從上圖可以瞭解到UIKit會先產生window的物件然後傳給appDelegate中的物件property,如果在create project勾選使用storyboard的話,Xcode會先幫忙把MainStoryboard的檔案資訊寫在info.plist中,當執行app的時候會先看plist的資訊,然後按照plist的資訊載入storyboard,然後再把appDelegate載入。因為是先載入storyboard,所以系統會先幫忙把appDelegate的window物件以及window.rootViewController給設定好,所以不用像以之前xib檔一樣再application:didFinishLaunchingWithOptions時才create window物件,然後設定rootViewController,只需要單純return YES即可。

a. 如果在create project點選use storyboard如下圖

b. 在Summary可以看到Main Storyboard會設定storyboard的檔案名稱:
c. 在info.plist可以看到main storyboard被設定,因此在run自己的app時xcode會自動幫忙做好上述載入流程,完全不用寫任何code

2. 手動載入storyboard:
手動載入storyboard的話需要UIStoryboard的物件,如果是手動的話上述流程會省略storyboard的物件生成,所以此時要生成storyboard物件的話可以在application:didFinishLaunchingWithOptions裡面載入,因為該method在每次程式被呼叫執行時都會執行該method所以在此載入(其實可以把該method想成iPhone或iPad程式的進入點,類似main function的概念)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]];
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

上述的方式是在程式一開始執行時想要使用storyboard的情形,其實storyboard也可以把它當成xib檔的打包檔案,以前一個xib檔對應一個viewController,可是這樣如果很多viewController的話也會產生很多xib檔,這樣會有點亂,且場景的變換已沒有storyboard來的清楚。要使用storyboard來載入設計好的view的話,可以載入UIStoryboard物件,然後使用instantiateViewControllerWithIdentifier:來獲得storyboard上設計好外觀的viewController,步驟如下:

a. 載入storyboard到UIStoryboard物件中

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" 
                                                     bundle:[NSBundle mainBundle]];

b. 把viewController實例化

myController *controller = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

此時可以得到一個實例化後的myController,即可操做viewController

注意:常常會看到在viewController中看到

[self.storyboard ...];

此時的storyboard是按照一般流程設定好的storyboard,即在application:didFinishLaunchingWithOptions:之前就預先載入好的storyboard,所以如果viewController如果要綁定一個storyboard的話需要在一開始就先設定好plist檔。

沒有留言:

張貼留言