реализация восстановления состояния в iOS 14

#ios #swift #state-restoration

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

Вопрос:

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

в AppDelegate

 func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }
    
    func application(_ application: UIApplication, shouldRestoreSecureApplicationState coder: NSCoder) -> Bool {
        return true
    }
    func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool {
        return true
    }
    
    func application(_ application: UIApplication, viewControllerWithRestorationIdentifierPath identifierComponents: [String], coder: NSCoder) -> UIViewController? {
        return coder.decodeObject(forKey: "Restoration ID") as? UIViewController
        
    }
    func application(_ application: UIApplication, didDecodeRestorableStateWith coder: NSCoder) {
        UIApplication.shared.extendStateRestoration()
        DispatchQueue.main.async {
            UIApplication.shared.completeStateRestoration()
        }
    }
  

на мой взгляд, контроллер:

 override func encodeRestorableState(with coder: NSCoder) {
        super.encodeRestorableState(with: coder)
        
        getSetDataFromTable()
        coder.encode(currentSession, forKey: "CurrentSession")
    
    }
    
    override func decodeRestorableState(with coder: NSCoder) {
        super.decodeRestorableState(with: coder)
        
        
        self.currentSession = coder.decodeObject(forKey: "CurrentSession") as! [CurrentSessionElement]
    }
    
    
    override func applicationFinishedRestoringState() {
        
        tableView.reloadData()
    }
    static func viewController(withRestorationIdentifierPath identifierComponents: [String], coder: NSCoder) -> UIViewController? {
            
        guard let restoredSession = coder.decodeObject(forKey: "CurrentSession") as? [CurrentSessionElement] else {
            print("decoding user detail")
            return nil
        }
        
        let vc = CurrentSessionVC()
        vc.currentSession = restoredSession
        return vc
    }
  

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

при загрузке: shouldRestoreSecureApplicationState
didDecodeRestorableStateWith

при очистке приложения: shouldSaveSecureApplicationState

При тестировании ничего не восстанавливается, и ни одна из функций контроллера представления не запускается, я что-то упускаю?

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

1. Взгляните на это . Не рекомендую отходить от SceneDelegate.

Ответ №1:

У меня была такая же проблема. Я удалил SceneDelegate, и все начало работать нормально. Насколько я понимаю, восстановление для SwiftUI работает по-другому, несовместимо с классическим потоком пользовательского интерфейса

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

1. Если вы ориентируетесь на iOS 13 или выше, удаление SceneDelegate не рекомендуется. Существует новый способ восстановления состояния для iOS 13 или выше, как в ответе Phantom59.

Ответ №2:

Я только вчера начал узнавать об этом. Существует два типа восстановления состояния; Старое восстановление на основе контроллера представления и новое восстановление на основе сцены, представленное в iOS 13 и более поздних версиях, ссылка в ответе @Phantom59 отлично объясняет это, и есть несколько сеансов с WWDC 2019.

То, что вы делаете в своем вопросе, является старым способом и работает только в том случае, если вы отказываетесь от жизненного цикла приложения на основе сцены.

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

1. Не говорите, что это не рекомендуется. Вполне нормально не использовать SceneDelegate, если ваше приложение не поддерживает несколько окон

2. @Adam спасибо за комментарий. Я изменил свой ответ.

Ответ №3:

Для iOS 13 и более поздних версий требуется восстановление состояния на основе сцены, о чем я узнал из официальной демонстрации. Проверьте следующий пример приложения, созданного для демонстрации восстановления состояния.

Официальный образец для 13 и более поздних версий

Пример восстановления состояния на основе сцены