整理一下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會自動幫忙做好上述載入流程,完全不用寫任何code2. 手動載入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檔。
沒有留言:
張貼留言