Сохранение и восстановление состояния приложения на iOS 6 без раскадровки

Я создал тестовое приложение, следуя этому руководству.

Я пытаюсь сделать то же самое без использования раскадровки, и это не работает. Я включил сохранение и восстановление состояния в 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;
}

person Numeral    schedule 20.11.2012    source источник


Ответы (2)


На самом деле ваши контроллеры представления восстанавливаются между 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;
}

Это сработало для меня. Также я рекомендую вам посмотреть сессию 208 WWDC 2012 — Сохранение и восстановление состояния приложения на iOS .

person fbernardo    schedule 31.05.2013

У меня было довольно много проблем, пытаясь реализовать это.

Во-первых, удалось ли вам реализовать эту работу с раскадровками?

Ваш код выглядит хорошо, и вам больше ничего не нужно, так как есть только 2 требования:

  1. Установите для shouldRestoreApplicationState и shouldSaveApplicationState значение YES в AppDelegate.
  2. Установите идентификатор восстановления для всех UIViewControllers (UIViews это не нужно)

Я бы посоветовал вам обратить внимание на то, как вы «убиваете» приложение.

В симуляторе:

  • Нажмите домашнюю кнопку симулятора.
  • Остановите приложение с помощью Xcode.
  • Воспроизведите приложение с помощью Xcode.

Действительно, система удаляет состояние вашего приложения, как только вы убиваете приложение из панели многозадачности.

Если вы хотите, чтобы панель многозадачности работала нормально, вам нужно установить для параметра "Приложение не работает в фоновом режиме" значение YES в файле Info.plist.

Надеюсь, поможет ;)

person sachadso    schedule 09.12.2012