#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 выпустят больше статей / видео на эту тему, потому что это действительно сбивает с толку.