如何通过特定屏幕显示我的iPhone应用程序?

时间:2009-10-24 23:24:17

标签: iphone uiviewcontroller uitabbarcontroller

我有一个包含大量屏幕的大应用程序,所有屏幕都排列在层次结构中,顶部是UITabBarController,下面是UINavigationControllers,然后是UIView控制器,可能还有一个模态控制器,可以用来测量。< / p>

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

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我通过将一堆不同的值保存为用户默认值来实现此目的。但是,我的applicationDidFinishLaunching方法有点乱,因为我使用一堆条件语句将视图控制器推入堆栈,决定选择哪个选项卡,决定是否显示模态视图等。

答案 3 :(得分:0)

我不确定你所描述的问题是什么。也就是说,为什么不呢

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

  • 重新创建视图层次结构,就好像用户已在appDidFinishLaunching中导航

...

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

如果您的问题/问题比这更复杂,可以编辑它来解释您遇到困难的具体部分。

答案 4 :(得分:0)

我是这样做的。 两个方法都在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;
}