3

我已经按照本教程完成了测试应用程序

我尝试在不使用 Storyboard 的情况下做同样的事情,但它不起作用。我在 AppDelegate 中启用了状态保存和恢复。我已将 restoreIdentifier 分配给我的所有控制器及其视图。我想我必须在 AppDelegate 中实现一些额外的代码来恢复 rootviewcontroller,但我找不到正确的方法来做到这一点。

-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
    return YES;
}

-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
    return YES;
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[[StateTestFirstViewController alloc] initWithNibName:@"StateTestFirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[StateTestSecondViewController alloc] initWithNibName:@"StateTestSecondViewController" bundle:nil] autorelease];
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.restorationIdentifier = @"TabBarController";
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;

    [self.window makeKeyAndVisible];

    return YES;
}
4

2 回答 2

5

实际上,application:willFinishLaunchingWithOptions:如果application:didFinishLaunchingWithOptions:您将代码更改为:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    UIViewController *viewController1 = [[[StateTestFirstViewController alloc] initWithNibName:@"StateTestFirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[StateTestSecondViewController alloc] initWithNibName:@"StateTestSecondViewController" bundle:nil] autorelease];
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.restorationIdentifier = @"TabBarController";
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    return YES;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {                
    [self.window makeKeyAndVisible];

    return YES;
}

它对我有用。我还建议您观看WWDC 2012 Session 208 — Saving and Restoreing Application State on iOS

于 2013-05-31T23:39:01.590 回答
4

我在尝试实现这一点时也遇到了很多问题。

首先,您是否成功地使用故事板完成了这项工作?

您的代码看起来不错,您不需要其他任何东西,因为只有 2 个要求:

  1. 在 AppDelegate 中将 shouldRestoreApplicationState 和 shouldSaveApplicationState 设置为 YES
  2. 将恢复 ID 设置为所有 UIViewControllers(UIViews 不需要它)

我建议您注意“杀死”应用程序的方式

在模拟器中:

  • 点击模拟器主页按钮。
  • 使用 Xcode 停止应用程序。
  • 使用 Xcode 播放应用程序。

事实上,一旦你从多任务栏中杀死应用程序,系统就会删除你的应用程序状态。

如果您希望它使用多任务栏正常工作,您必须在 Info.plist 文件中将“应用程序不在后台运行”设置为“是”。

希望能帮助到你 ;)

于 2012-12-09T11:37:15.813 回答