【问题标题】:How can I have my iPhone app start with a specific screen showing?如何让我的 iPhone 应用程序以特定屏幕显示开始?
【发布时间】:2010-12-09 19:42:26
【问题描述】:

我有一个很大的应用程序,有很多屏幕,全部按层次结构排列,顶部有一个 UITabBarController,下面是 UINavigationControllers,然后是下面的 UIView 控制器,也许在某个地方放了一个模态控制器以作为很好的衡量标准。

允许用户从列表中选择开始屏幕。选择后,下次启动应用程序时,它将从指定的屏幕开始,所有导航都将像他们自己导航到那里一样工作。

由于我不能继承 UITabBarController 和 UINavigationController,我不能添加任何 ivars 来设置任何初始导航信息。

那么,在这些条件下设置层次结构并显示正确视图控制器的屏幕并快速完成的最佳方法是什么?

【问题讨论】:

    标签: iphone uiviewcontroller uitabbarcontroller


    【解决方案1】:

    您需要在退出前检查 NSCoder 并保存视图层次结构。这样,要加载它们,您只需反序列化视图层次结构并且状态应该相同。

    【讨论】:

    • 一个有趣的建议,但我认为会有问题。我不需要也不希望我的整个层次结构被保存和恢复,只是必要控制器的状态。如果我这样做,它也会保存视图吗?
    • 通过实现 NSCoder,您是负责编写所需内容并重新初始化所需内容的人。这是一种保存应用程序状态的快速方法,而不是视图本身。它为您提供了一种安全可靠地重新加载视图控制器等的方法……而无需对 NSUserDefaults 或其他任何方式进行 100 次调用。
    • 一个问题 coney - 我按照我在答案中列出的方式进行操作的部分原因是因为我可以在用户浏览应用程序时保存应用程序的状态(为导航设置委托控制器,实现 navigationController:willShowViewController:animated 或 didShow)。使用您的方法, applicationWillTerminate 是否有任何危险不会被调用或无法完成?
    • 您仍然可以在用户使用 NSCoder 浏览状态时保存状态。看看 Three20 是如何做到的。它是 NSCoder 和 View Hierarchy 保存的一个典型例子。
    【解决方案2】:

    保存用户每次想要加载的选项卡的索引,然后在应用启动时将 UITabBarController.selectedIndex 属性设置为此索引,然后您需要在 UITabBarController.selectedViewController 上调用 viewDidAppear。这应该会触发索引设置为可见。

    【讨论】:

    • 这是最简单的部分。其他所有的视图控制器怎么样?
    【解决方案3】:

    我通过将一堆不同的值保存为用户默认值来做到这一点。但是,我的 applicationDidFinishLaunching 方法有点混乱,因为我使用一堆条件语句将视图控制器推送到堆栈上,决定选择哪些选项卡,决定是否显示模式视图等。

    【讨论】:

    • 这就是我不希望以这样的方式结束:一个大的字符串球在一个地方。但是如果没有其他办法,我会在这里结束......
    【解决方案4】:

    我不确定您描述的问题是什么。也就是说,为什么不只是

    • 在应用退出时保存当前显示的视图(如果只有一种方式可以到达那里)或用户的导航路径(如果有多条路线),然后

    • 重新创建视图层次结构,就像用户在您的 appDidFinishLaunching 中导航一样

    ...?

    因此,例如,您可以在控制器被推入堆栈时保存它们的类名,然后在应用重新加载时创建单独的控制器类并将它们推入导航堆栈。对于选项卡控制器,您需要保存当时选择的选项卡的索引。

    如果您的问题/问题比这更复杂,也许可以对其进行编辑以解释您遇到问题的具体部分。

    【讨论】:

    • 我知道实现目标的几种方法,但我要求最好的方法。特别是,建议的方法都需要一个集中的代码,它知道整个应用程序的导航。如果导航更改而不更新,它将中断。我真正想要的是一种分布式的、面向对象的方法。
    【解决方案5】:

    这就是我的做法。 这两个方法都在 appDelegate 中,而 tabBarController 是一个实例变量。

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        /*
         Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
         If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
         */
    
        //Remember the users last tab selection
        NSInteger tabIndex = self.tabBarController.selectedIndex;
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setInteger: tabIndex forKey:@"activeTab"];
    
        if (![userDefaults synchronize]) 
        {
            NSLog(@"Error Synchronizing NSUserDefaults");
        }
    
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        /*
         Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
         */
    
        //Set the tabBarController to the last visted tab
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        int activeTab = [(NSNumber*)[userDefaults objectForKey:@"activeTab"] intValue];
        self.tabBarController.selectedIndex = activeTab;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2016-09-18
      • 1970-01-01
      相关资源
      最近更新 更多