swift 在iOS 14中实现状态恢复

kx7yvsdv  于 2022-10-31  发布在  Swift
关注(0)|答案(3)|浏览(349)

我正在尝试在我的应用程序中实现状态恢复,我已经阅读了大量的文章和文档,但到目前为止,我还没有能够让它工作。我已经给了所有的视图控制器一个恢复ID,并(我认为)有所有必要的功能,让它工作。
单位为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
    }

我在所有函数中设置了断点,当我尝试测试功能时,遇到的断点是
加载时:shouldRestoreSecureApplicationStatedidDecodeRestorableStateWith
清除应用程序时:shouldSaveSecureApplicationState
测试时未恢复任何内容,并且未触发任何视图控制器功能,是否遗漏了什么?

sczxawaw

sczxawaw1#

我也遇到了同样的问题。我删除了SceneDelegate,一切都开始正常工作。据我所知,SwiftUI的恢复是以另一种方式工作的,与经典的UI流不兼容

2w2cym1i

2w2cym1i2#

我昨天才开始学习这个。有两种类型的状态恢复;旧的基于视图控制器的恢复,和新的基于场景的恢复在iOS 13和更高版本中引入,@Phantom59答案中的链接很好地解释了它,有一些来自WWDC 2019的会议。
你在问题中所做的是旧的方式,只有在你选择退出基于场景的应用生命周期时才有效。

yqyhoc1h

yqyhoc1h3#

iOS13和更高版本需要基于场景的状态恢复,我从官方演示中发现了这个问题。请检查以下创建的示例应用程序以演示状态恢复。
Official Sample for 13 and later
Scene based state restoration sample

相关问题