Включить восстановление состояния на iOS

#ios #swift #xcode #state-restoration

#iOS #swift #xcode #восстановление состояния

Вопрос:

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

 func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool {
    return true;
}

func application(_ application: UIApplication, shouldRestoreSecureApplicationState coder: NSCoder) -> Bool {
    return true;
}
 

Я не знаю, что еще я должен делать. Я попытался поместить точки останова внутрь encodeRestorableState и decodeRestorableState , но, похоже, они не вызываются, пока отладчик подключен. Я использую раскадровки, поэтому, насколько я понимаю, все остальное должно происходить автоматически.

Чтобы протестировать восстановление состояния, я запускаю приложение в симуляторе, изменяю состояние (выбираю вкладку на панели вкладок), нажимаю кнопку «Домой» в симуляторе, завершаю работу приложения из Xcode и, наконец, снова запускаю приложение из симулятора, щелкнув значок на главном экране. На короткое время я вижу вкладку, которую я выбрал ранее, но затем она переключается на первую вкладку.

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

Я подумал, что, возможно, текущий выбранный элемент на панели вкладок — это то, что не сохраняется и не восстанавливается автоматически, поэтому я попытался поместить это в контроллер представления панели вкладок:

 override func encodeRestorableState(with coder: NSCoder) {
    coder.encode(selectedIndex, forKey: "selectedIndex");
    super.encodeRestorableState(with: coder);
}

override func decodeRestorableState(with coder: NSCoder) {
    super.decodeRestorableState(with: coder);
    selectedIndex = coder.decodeInteger(forKey: "selectedIndex");
}
 

Это не имело никакого эффекта. Я не могу понять, что я делаю не так.

Комментарии:

1. Используете ли вы их в UIApplicationDelegate или UISceneDelegate . Для iOS 13 это должно быть в UISceneDelegate

2. @udbhateja Не могли бы вы подробнее остановиться на этом? Насколько я могу судить, в UISceneDelegate протоколе нет никаких application методов. Я видел упоминание об NSUserActivity этом. Похоже, что iOS 13 заменила это совершенно другим механизмом.

3. Вы в конечном итоге реализовали его и заставили его работать SceneDelegate ? В настоящее время я тоже застрял.

4. @dsonawave я в конечном итоге использовал UserDefaults , хотя он не предназначен для этой цели. Это было намного проще, чем пытаться работать с. NSUserActivity

5. Черт возьми, да, надеюсь, в ближайшем будущем люди из сообщества Swift выпустят больше статей / видео на эту тему, потому что это действительно сбивает с толку.