在应用程序中使用多个故事板的最佳方式

时间:2014-01-11 18:56:01

标签: ios iphone objective-c uiviewcontroller uistoryboard

我目前正在开发一个将使用多个故事板的应用程序,如下所示:

1)login.storyboard(处理注册和登录)

2)main.storyboard(处理游戏选项和选择)

3)settings.storyboard(处理游戏设置)

4)game.storyboard(实际游戏)

我目前正在测试NSUserDefaults中的会话令牌,如果它存在,请使用以下命令加载main.storyboard,否则为auth.storyboard:

NSUserDefaults *tagDefaults = [NSUserDefaults standardUserDefaults];

if (![tagDefaults objectForKey:@"session_token"]) {

    NSLog(@"session token not found");
    NSString *storyboardId = @"nonauth";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"login" bundle:nil];
    UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:storyboardId];

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

} else {

    NSString *storyboardId = @"init";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"init" bundle:nil];
    UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:storyboardId];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = initViewController;
    [self.window makeKeyAndVisible];
}
如果登录返回有效,则从登录屏幕

我使用它在我的NSURLSession完成处理程序中从login.storyboard切换到main.storyboard:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"main" bundle:nil];
    UINavigationController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"main"];
    self.view.window.rootViewController = viewController;

我的两个问题是: A)这是实现这个的正确方法吗? B)在main.storyboard实际加载(延迟20-30秒)之前从login.storyboard执行切换后有相当长的延迟,有没有办法加快速度或改进代码以避免这种延迟?

提前致谢。

Ĵ

2 个答案:

答案 0 :(得分:4)

  1. 请勿更改根视图控制器。没有必要。应用程序应该在应用程序的整个生命周期内都有一个根视图控制器。如果要使用视图控制器的视图完全替换该接口,则显示该视图控制器。呈现的视图控制器可以出现,并在应用程序的剩余生命周期内保持不变。 (实际上,如果登录界面是更罕见的界面,那么将主界面作为主界面并在其上面显示登录界面会更有意义。)

  2. 出于同样的原因,无需同时使用登录故事板和主故事板。这些界面集可以在同一个故事板中,因此无需加载新的故事板。

答案 1 :(得分:2)

我倾向于以模态方式呈现登录VC。我总是加载主VC。如果不存在会话令牌,那么我模态地呈现登录VC而没有动画。实际上,这使得它看起来好像启动时存在登录视图。一旦用户成功登录,您就可以解除典型的模式消除(从屏幕底部掉下来)或做一些像交叉淡入淡出的事情。

对于故事板,我个人使用多个。如果您有一个非平凡的应用程序,SB中的视图数量可能会变得非常大。它可能很难管理 - 在视图海中找到你想要的那个是令人讨厌和耗时的。此外,它让我的机器可怕地陷入困境。也许最重要的是,如果你正在组建一个拥有源代码控制的团队(你绝对应该使用它) - 尝试管理对单一SB的访问权限真的很烦人。通常,如果多个开发人员修改单个SB,则无法合并更改。至少有多个人可以将不同的人分配给不同的任务,每个任务都与自己的SB绑定。拥有多个SB没有性能优势(只有实例化的视图占用内存)。但从开发效率的角度来看,有一些优势。