每次都恢复状态?

时间:2016-01-04 21:31:29

标签: ios swift appdelegate state-restoration

我的应用程序有一个视图控制器,即使用户自己杀死了应用程序也必须恢复,shouldRestoreApplicationState不会这样做;如果用户杀了应用程序,我会回到第一个控制器。

那么有没有办法做我想做的事情,每次都要恢复状态?

如果状态恢复不可能,我想也许我可以将视图控制器保存到我的持久存储中并从我的appDelegate中显示它,但我还无法解决这个问题。我必须从appDelegate重建整个导航堆栈,包括标签栏控制器和直到该视图的多个导航控制器。这是一个好主意吗?我应该怎么做呢?

我试过这个变种:

        let bookInfoStoryboard = UIStoryboard(name: "BookInfo", bundle: nil)
        let controller = bookInfoStoryboard
            .instantiateViewControllerWithIdentifier("bookInfoTableViewController")
        self.window?.makeKeyAndVisible()
        self.window?.rootViewController!.presentViewController(controller, animated: true, completion: nil)

但我不断收到各种错误。

理想情况下,我想恢复每个视图控制器的状态,但每次都必须发生。有没有更好的方法呢?

谢谢,

丹尼尔

2 个答案:

答案 0 :(得分:2)

与这样的标准行为作斗争可能是一个坏主意。如果你的应用程序中存在错误,那么就会出现这种情况,并且它会不断恢复糟糕状态并陷入困境。

如果你真的想这样做,你就不能使用UIKit的状态恢复系统,所以你必须建立自己的状态。在iOS 6中添加UIKit功能之前,这种情况非常常见。Cristik’s answer是实现此类系统的良好起点。

答案 1 :(得分:2)

持久化视图控制器是不可能的,因为它们带有大量的瞬态信息,而且持久性很差。

您可以做的是将代表视图控制器层次结构的配置保存到user defaults,然后从那里重建。例如,假设您有一个包含导航等文件系统的选项卡视图,您可以将user defaults这样的字符串保留为bookmarks.folder1.subfolder2.file18.playing.position=19.28.mycheckbox:checked { background: url(icon.png)no-repeat center center; background-size: 100%; } 。这可能对应于正在播放的视频文件,并且在应用程序崩溃之前达到19.28秒,或者被操作系统终止。

通过使用类似上面的模式,您可以将控制器恢复到非常接近上一个会话结束前的状态。最好的部分是用户甚至不必知道您的应用程序已经全部启动,他将获得与上次浏览应用程序时相同的体验。

当然,恢复取决于应用程序的复杂程度,并且可能不适用于应用程序中的所有流程,但是对于这种情况,您至少可以将用户返回到更接近退出之前的应用程序状态。