iOS - восстановление состояния - получить ранее восстановленный контроллер представления

У меня есть навигационный контроллер с несколькими контроллерами представления внутри.

При восстановлении приложения метод application(_:viewControllerWithRestorationIdentifierPath:coder:) вызывает для каждого контроллера один за другим сначала первый в стеке, затем второй и так далее. Во время восстановления второго контроллера просмотра мне нужно получить ссылку на первый (чтобы установить связь между ними).

Есть ли способ получить ранее восстановленный контроллер на этом этапе, не сохраняя этот контроллер где-то в приложении? (то же самое и с навигационным контроллером, я не сохраняю ссылки на него нигде в приложении)


person abagmut    schedule 22.05.2017    source источник


Ответы (2)


Насколько я понимаю, только последний View Controller, просмотренный до того, как приложение было отправлено в фоновый режим, будет восстановлен с помощью методов кодирования/декодирования, которые вы указали выше, с помощью NSCoder. НО вам все равно нужно сохранить свои данные, например. с помощью NSKeyedArchiver или Core Data в случае закрытия приложения пользователем или перезагрузки устройства. Это может быть лучшим решением в вашем случае.

См. ссылку для encodeRestorableState здесь:

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621461-encoderestorablestate

В частности, говорится:

Этот метод не заменяет постоянного сохранения структур данных вашего приложения на диск. Вам следует продолжать сохранять фактические данные вашего приложения в iCloud или в локальную файловую систему, используя существующие методы. Этот метод предназначен только для сохранения состояния конфигурации или другой информации, связанной с пользовательским интерфейсом вашего приложения. Вы должны рассматривать любые данные, которые вы записываете в кодировщик, как подлежащие очистке и быть готовыми к тому, что они будут недоступны при последующих запусках.

person kook-a-munga    schedule 08.07.2017

Закодируйте второй контроллер представления в методе encodeRestorableState первого контроллера представления. например

FirstViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue{
     // configure and store it...
     // self.secondViewController = controller;
}

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
    if (self.secondViewController) {
        [coder encodeObject:self.secondViewController forKey:kSecondViewControllerKey];
    }
}

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    [super decodeRestorableStateWithCoder:coder];
    self.secondViewController = [coder decodeObjectForKey:kSecondViewControllerKey];
}

- (void)applicationFinishedRestoringState{
    // self.secondViewController's properties are now also decoded and ready to be used
}

application:viewControllerWithRestorationIdentifierPath: может вернуть nil для второго контроллера представления, и он будет один из раскадровки для вас, а ссылка будет тем, что возвращается в decodeObjectForKey.

person malhal    schedule 30.05.2019