本文说的情况是:
1.在创建工程时,选中了Use StoryBoards。
2.在创建工程时,没有选中User StoryBoards,在后面想添加StoryBoard。
本文是也是对上一篇文章的补充,上一篇说的不全面(“不要在storyBoard和代码中混用UINavigationController”).
上一篇文章是针对第一种情况的,这时候你Appdelegate里的函数很简单,像下面这个样子():
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. TDRViewController *tdrVC=[[TDRViewController alloc] init]; [self.window addSubview:tdrVC.view]; // self.navController=[[UINavigationController alloc] initWithRootViewController:tdrVC]; // [self.window addSubview:self.navController.view]; return YES; }
因为编译器在你创建工程的时候就将MainStoryBoard和Appdelegate关联好了,所以你不需要自己初始化self.window,编译器会调用MainStoryBoard中的window,这时候如果你自己初始化一个window反而会有问题(见上一篇文章)。
对于第二种情况,你的storyBoard是在中途加进来的(命名为Storyboard),那么这个storyBoard并没有Appdelegate关联,编译器也不会自动调用Storyboard中的window。这时候,你就需要自己初始化window了,而且需要用代码去调用StoryBoard和设置rootViewController。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; UIStoryboard *storyBoard=[UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];//调用storyBoard self.window.rootViewController=[storyBoard instantiateInitialViewController];//用storyBoard的rootVC作为window的rootVC [self.window makeKeyAndVisible]; return YES; }
如果我想在项目中使用多个StoryBoard,该怎么办呢?
添加secondStoryBoard,在界面中关联好你想要的ViewController。
在需要跳转到secondStoryBoard时,像这样:
UIStoryboard *secondStoryboard = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil]; [self presentModalViewController:[secondStoryboard instantiateInitialViewController] animated:YES];
补充:
1.有时候发现在StoryBoard中的ViewController中设置好的title,button在程序运行的时候并没有显示出来,这里的原因是你在代码中用类似于下面的代码:ViewController *VC=[[ViewController alloc] init]生成了一个ViewController新的实例,这个实例并没有与StoryBoard中的ViewController相关联。
为了避免这种情况,你可以通过StoryBoard来生成ViewController的实例。首先,在Identity Inspector中为ViewController设置StoryBoardID,Xcode4.6中设置如下:
以前版本的Xcode,设置项在attributes Inspector->View Controller->identifier.
然后,使用Identifier从Storyboard中获取指定的视图控制器:
UIStoryboard *mainStory=[UIStoryboard storyboardWithName:@"MainStoryBoard" bundle:nil]; diskMainViewController *diskMainVC=[mainStory instantiateViewControllerWithIdentifier:@"diskMainVC"]; [self.navigationController pushViewController:diskMainVC animated:YES];