2009-10-24 63 views
4

我有一个很大的屏幕应用程序,所有的排列在一个层次结构中,顶部有一个UITabBarController,下面是UINavigationControllers,然后是下面的UIView控制器,也许有一个模式控制器在某个地方引发了很好的测量。如何让我的iPhone应用程序以特定屏幕显示?

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

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

那么,在这些条件下显示正确的视图控制器的屏幕,并且快速执行操作的最佳方式是什么?

回答

1

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

+0

一个有趣的建议,但我认为会有问题。我不需要或希望我的整个层次结构保存和恢复,只需要控制器的状态。如果我这样做,它会保存的意见呢? – 2009-10-25 00:43:42

+0

通过实施NSCoder,您负责编写您需要的内容,并重新初始化您需要的内容。这是一种节省应用程序状态的快速方法,而不是视图本身。它为您提供了一种安全可靠地重新加载视图控制器等的方法......无需对NSUserDefaults进行100次调用。 – coneybeare 2009-10-25 04:49:53

+0

coney的一个问题 - 我按照我在答案中列出的方式进行操作的部分原因是因为我可以在用户前进时保存应用程序的状态(为导航控制器设置委托,实现navigationController:willShowViewController:动画或didShow)。用你的方法,在applicationWillTerminate中是否有任何危险不会被调用或不会完成? – bpapa 2009-10-25 14:04:47

0

保存用户每次想要加载的标签的索引,然后当应用程序开始将UITabBarController.selectedIndex属性设置为该索引时,则需要在UITabBarController.selectedViewController上调用viewDidAppear。这应该会触发索引设置为可见。

+0

这是最简单的部分。所有其他视图控制器如何? – 2009-10-25 00:39:35

0

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

+0

这就是我最终不想结束的地方:在一个地方放着一个大球。但如果没有别的方法,我会在这里结束...... – 2009-10-25 04:06:42

0

我是不知道你描述的是什么问题。也就是说,为什么不

  • 保存无论是当前显示的视图(如果只有到那里单程)或用户的导航路径(如果有多个路由)上的应用程序退出,然后

  • 重新创建视图的层次结构,如果用户已经在你的appDidFinishLaunching

导航...?

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

如果您的问题比这个更复杂,可以编辑它来解释您卡住的具体部分。

+0

我知道几种方法来实现我的目标,但我要求最好。特别是,建议的方法都需要知道整个应用程序导航的集中式代码片段。如果导航栏更改而未更新,它将会中断。我真正想要的是一种分布式OO方式。 – 2009-10-25 18:30:10

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; 
} 
相关问题