现在的位置: 首页 > 综合 > 正文

创建带StoryBoard的工程和在编码途中加入StoryBoard的差别

2013年08月09日 ⁄ 综合 ⁄ 共 2373字 ⁄ 字号 评论关闭

本文说的情况是:

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];


抱歉!评论已关闭.