Настройка
У меня есть настраиваемый контроллер представления контейнера с скользящим меню (MMDrawerController), управляющий контроллером центрального представления и выдвижным левым меню. /выдвижной ящик. Так же, как приложение Facebook и сотни других.
Открытие ящика слева и нажатие пункта меню заменяет контроллер центрального вида.
Что работает
Если я открою приложение, нажму кнопку на первом контроллере центрального вида (который изменит цвет фона), я смогу закрыть приложение и успешно восстановить цвет фона. Идеально.
Что не работает
Если я выберу другой центр vc для загрузки (открыв меню/ящик и выбрав пункт меню), а затем уничтожу приложение, приложение не будет восстановлено на этот контроллер представления.
Что я делаю
В моем родительском контроллере представления я кодирую контроллеры левого и центрального представления, чтобы я мог воссоздать их при восстановлении.
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.centerViewController forKey:@"centerVC"];
[coder encodeObject:self.leftDrawerViewController forKey:@"leftDrawerVC"];
[super encodeRestorableStateWithCoder:coder];
}
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
// if I don't change the center view controller, these values
// get logged out as expected
NSLog(@"leftDrawer: %@", [coder decodeObjectForKey:@"leftDrawerVC"]);
NSLog(@"center: %@", [coder decodeObjectForKey:@"centerVC"]);
[super decodeRestorableStateWithCoder:coder];
}
В потоке, где я меняю цвет на первом контроллере центрального представления, во время декодирования я могу успешно вернуть центральный и левый контроллеры представления. Однако в потоке, где я выбираю новый центр vc для загрузки, во время декодирования эти объекты равны нулю.
Как настроить собственный контроллер представления контейнера для правильного кодирования ссылок на его дочерние элементы таким образом, чтобы я гарантированно возвращал их обратно при декодировании?
ОБНОВЛЕНИЕ 1
С помощью restorationArchiveTool я проверил архив после запуска сценария, который не восстанавливается должным образом, и архив на самом деле содержит иерархию закодированных объектов, которую я ожидал. Я до сих пор не могу понять, почему эти ранее закодированные контроллеры представления в конечном итоге становятся нулевыми во время декодирования.
ОБНОВЛЕНИЕ 2 Если вы посмотрите на раздел комментариев к этой сути, вы можно видеть, что все правильные вызовы кодирования/декодирования, похоже, происходят при сохранении и восстановлении. Мне интересно, если в моем делегате приложения, когда я изначально настраиваю свой корневой контроллер представления (экземпляр mmdrawercontroller), если я каким-то образом стираю восстановление состояния? Вот что я делаю:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UINavController *centerNav = [[UINavController alloc] initWithRootViewController:[FeaturedViewController new]];
centerNav.restorationIdentifier = @"centerNav";
UINavigationController *leftDrawerNavController = [[UINavigationController alloc] initWithRootViewController:[LeftDrawerViewController new]];
leftDrawerNavController.restorationIdentifier = @"leftDrawerNav";
MMDrawerController *drawerViewController = [[MMDrawerController alloc] initWithCenterViewController:centerNav leftDrawerViewController:leftDrawerNavController];
// no restoration class, since this will always be created before state restoration resumes, and therefore will be found implicitly
[drawerViewController setRestorationIdentifier:@"mmDrawer"];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = drawerViewController;
self.window.restorationIdentifier = NSStringFromClass([UIWindow class]);
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return true;
}