【问题标题】:Best way to use multiple storyboards in app在应用程序中使用多个故事板的最佳方式
【发布时间】:2014-01-11 18:56:00
【问题描述】:

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

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 实际加载之前从 login.storyboard 执行切换后有相当长的延迟(延迟 20-30 秒),有没有办法加快速度或改进代码以避免这种延迟?

提前致谢。

J

【问题讨论】:

  • 此代码在应用程序的哪个位置?登录是否执行 Web 请求?是否有可能部分/全部延迟来自网络请求?
  • 为什么要使用这么多故事板?您应该只为 iPhone 使用一个情节提要,如果需要,还应该为 iPad 使用一个情节提要。但不适用于应用程序内的每个部分...
  • 是的,登录确实执行了 NSURLSession 请求。服务器响应几乎是立即的,并且几乎立即记录到 NSLog,所以我不认为这是瓶颈。
  • @thorb 登录功能和注册是一个很少需要的视图,因此在 90% 的时间都不需要时加载和保留这些视图似乎很浪费。
  • @RWSDevTeam 这不是故事板的工作方式。除非实际需要,否则不会“加载并保留”视图或视图控制器。故事板非常有效。不要过早优化。

标签: ios iphone objective-c uiviewcontroller uistoryboard


【解决方案1】:
  1. 不要更改根视图控制器。没有必要。一个应用程序在应用程序的整个生命周期中都应该有一个根视图控制器。如果您想用视图控制器的视图完全替换界面,请呈现该视图控制器。呈现的视图控制器可以出现并在应用程序的剩余生命周期内一直呆在那里。 (其实如果登录界面是比较少见的界面,把主界面作为主界面,把登录界面呈现在上面会更有意义。)

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

【讨论】:

  • 有许多不同的视图控制器,因此我觉得最好将它们相对地放置到细分的故事板中。这难道不是比加载一个包含大量通常不会使用的 VC 的故事板更好的优化吗?
  • 显然不是,因为您自己说切换故事板和根视图控制器很慢。按照我建议的方式实际尝试查看是否有帮助?
【解决方案2】:

我倾向于以模态方式呈现登录 VC。我总是加载主VC。如果不存在会话令牌,那么我会以模态方式呈现登录 VC,而无需动画。实际上,这使它看起来好像登录视图在启动时存在。用户成功登录后,您可以使用典型的模式关闭(从屏幕底部掉下来)关闭或执行交叉淡入淡出等操作。

对于故事板,我个人使用多个。如果您有一个非平凡的应用程序,那么 SB 中的视图数量可能会变得非常大。这可能很难管理 - 在海量景观中找到您想要的,既烦人又耗时。此外,它使我的机器严重瘫痪。也许最重要的是,如果您在一个具有源代码控制的团队中工作(您绝对应该使用它) - 尝试管理对一个单一 SB 的访问真的很烦人。通常,如果多个开发人员修改单个 SB,则无法合并更改。至少有多个,您可以将不同的人分配给不同的任务,每个任务都与他们自己的 SB 相关联。拥有多个 SB 没有性能优势(只有实例化的视图占用内存)。但是从开发效率的角度来看是有优势的。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多