Сохранение состояния iOS и просмотр контейнеров

У меня есть контроллер представления в раскадровке, использующей представление контейнера. Оба имеют идентификаторы восстановления. Родитель сохраняется и восстанавливается просто отлично. Ребенок, однако, нет. Ни один из -encodeRestorableStateWithCoder: или -decodeRestorableStateWithCoder: на контроллере дочернего представления.

Каков правильный способ сохранения дочерних контроллеров представления, созданных с помощью контейнера представления? Я могу сохранить контроллер дочернего представления в родителях -encodeRestorableStateWithCoder: что приведет к его сохранению, но у меня нет способа использовать его во время восстановления.

2 Solutions collect form web for “Сохранение состояния iOS и просмотр контейнеров”

Контроллер просмотра контейнера " не сохраняет автоматически ссылки на какие-либо содержащиеся контроллеры дочерних представлений. Если вы создаете настраиваемый контроллер представления контейнеров, вы должны сами закодировать объекты контроллера детского представления, если хотите, чтобы они были сохранены ".

Существуют простые правила, которые я нашел:

Контроллер вида 1.Begedded (child) должен быть уже создан и добавлен в контроллер родительского представления при сохранении состояния. Таким образом, не нужно ничего делать, если вы используете раскадровку, иначе вам нужно создать экземпляр контроллера дочернего представления и добавить его вручную:

 -(void)viewDidLoad { [super viewDidLoad]; NSLog(@"Did load"); MyChildViewController *childViewController = [MyChildViewController new]; [self addChildViewController:childViewController]; [childViewController didMoveToParentViewController:self]; self.childVC = childViewController; } 

Вы можете добавить дочерний вид в -viewDidLoad или позже. Используйте self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view]; self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view]; для этого.

2. Вам не нужно сохранять контроллер дочернего представления в родительском -encodeRestorableStateWithCoder: сам, но вы должны закодировать ссылку на этот объект, используя -encodeObject:forKey: Если у вас есть ссылка, вы можете сделать это следующим образом:

 -(void)encodeRestorableStateWithCoder:(NSCoder *)coder { NSLog(@"Encode"); UIViewController *childViewController = self.childVC; [coder encodeObject:childViewController forKey:@"ChildVC"]; [super encodeRestorableStateWithCoder:coder]; } 

см. https://stackoverflow.com/a/13279703/2492707, чтобы получить ссылку на дочерний VC, если вы используете раскадровку. Или вы можете написать что-то простое:

 -(void)encodeRestorableStateWithCoder:(NSCoder *)coder { NSLog(@"Encode"); UIViewController *childViewController = [self.childViewControllers objectAtIndex:0]; //[self.childViewControllers lastObject]; [coder encodeObject:childViewController forKey:@"ChildVC"]; [super encodeRestorableStateWithCoder:coder]; } 

3. Встроенный (дочерний) контроллер представления должен быть уже создан и добавлен в контроллер родительского представления в процессе восстановления состояния . Итак, если вы сделали все в первом абзаце, здесь больше нечего делать.

4. «В этом случае мы не декодируем контроллер детского представления. Мы могли бы , но на самом деле нам это не нужно. Объект MyChildViewController будет восстанавливать свое собственное состояние. Мы только кодировали эту ссылку, чтобы получить время выполнения для перехода по цепочке к экземпляру MyChildViewController и сохранения и восстановления на нем ».

 -(void)decodeRestorableStateWithCoder:(NSCoder *)coder { NSLog(@"Decode"); [super decodeRestorableStateWithCoder:coder]; } 

Эта книга помогает мне понять сохранение состояния с помощью контейнеров. Также ищите хороший пример для этой книги

Я думаю, что ответ в документации. Говорят:

«Класс UIViewController сохраняет ссылку на представленный контроллер представления и раскадровку (если они есть), которые использовались для создания контроллера вида. Контроллер представления также запрашивает представления в своей иерархии представлений, чтобы сохранить любую соответствующую информацию. Однако этот класс автоматически не сохраняет ссылки на какие-либо содержащиеся контроллеры дочерних представлений. Если вы создаете настраиваемый контроллер представления контейнера, вы должны сами закодировать объекты контроллера дочернего представления, если хотите, чтобы они были сохранены ».

Поэтому вы можете сделать что-то подобное:

 -(void)encodeRestorableStateWithCoder:(NSCoder *)coder { [super encodeRestorableStateWithCoder:coder]; [self.myChildViewController encodeRestorableStateWithCoder:coder]; } -(void)decodeRestorableStateWithCoder:(NSCoder *)coder { [super decodeRestorableStateWithCoder:coder]; [self.myChildViewController decodeRestorableStateWithCoder:coder]; } 

А в MyChildViewController не называйте супер 🙂

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.