Контроллеры встраивания Segue Destination View исключены из восстановления состояния пользовательского интерфейса

Мое приложение использует встроенные переходы для одновременного отображения нескольких контроллеров представления на экране. Я пытаюсь реализовать восстановление состояния UIKit, но инфраструктура не просит мои встроенные контроллеры представления кодировать и декодировать их состояния. Это происходит автоматически со всеми другими типами переходов.

Возможно ли восстановление состояния UIKit с помощью встроенных переходов?

Вот пример приложения, демонстрирующего эту проблему: https://github.com/paulhimes/RestoreEmbeddedTest


person Paul    schedule 29.12.2013    source источник
comment
Неудачно? Я борюсь с той же проблемой.   -  person kvn    schedule 05.12.2014
comment
Глядя на связанный проект, вы заставили его работать.   -  person kvn    schedule 05.12.2014


Ответы (2)


Основываясь на проекте, на который вы ссылаетесь, хитрость заключается в том, чтобы закодировать встроенный VC из реализации кодирования контейнерного VC.

person kvn    schedule 05.12.2014

Вы можете закодировать свойства контроллера embed-segue, полученные из prepareForSegue, или просто закодировать дочерние элементы следующим образом:

ContainerController.m

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
    for(UIViewController *cvc in self.childViewControllers){
        if(!cvc.restorationIdentifier){
            continue;
        }
        [coder encodeObject:cvc forKey:cvc.restorationIdentifier];
    }
}

А в дочернем контроллере вы должны реализовать encode и либо не вызывать super, либо очищать объект раскадровки. Причина в том, что если вы решите реализовать viewControllerWithRestorationIdentifierPath и вернуть nil, когда вы не хотите, чтобы контроллер появлялся (например, из-за устаревших данных), встроенные контроллеры затем будут без необходимости создавать экземпляры с использованием раскадровки, что, честно говоря, очень странно, даже происходит, учитывая, что возврат nil должен предотвратить восстановление по этому пути.

EmbeddedController.m

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    // super not called to prevent encoding storyboard
    // or call super and then encode nil for UIStateRestorationViewControllerStoryboardKey
}
person malhal    schedule 28.10.2019