每次都恢复状态?

Posted

技术标签:

【中文标题】每次都恢复状态?【英文标题】:Restore state every single time? 【发布时间】:2016-01-04 21:31:29 【问题描述】:

我的应用程序有一个视图控制器,即使用户自己杀死了应用程序,它也必须恢复,而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)

但我不断收到各种错误。

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

谢谢,

丹尼尔

【问题讨论】:

请注意,UINavigationController 有一个您可以设置的 viewControllers 属性。如果您将 rootViewController 设为 UINavigationController,然后重新创建视图控制器链,您可以一次设置它们,最后一个是可见的。 【参考方案1】:

持久化视图控制器是不可能的,因为它们携带了大量的瞬态信息,而持久化的信息却很少。

您可以做的是将表示视图控制器层次结构的配置保存到user defaults,然后从那里重建。例如,假设您有一个带有类似导航的文件系统的选项卡视图,您可以将这样的字符串持久保存到user defaultsbookmarks.folder1.subfolder2.file18.playing.position=19.28。这可能对应于正在播放的视频文件,并在应用程序崩溃或被操作系统终止之前达到 19.28 秒。

通过使用上述模式,您可以将控制器恢复到非常接近上次会话结束之前的状态。最棒的是,用户甚至不必知道您的应用程序已经重新开始,他将获得与上次浏览应用程序时相同的体验。

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

【讨论】:

【参考方案2】:

反对这样的标准行为可能是个坏主意。如果您的应用程序中存在错误并且它会不断恢复不良状态并卡住,就会出现这种行为。

如果你真的想这样做,你不能使用 UIKit 的状态恢复系统,所以你必须自己构建。在 ios 6 中添加 UIKit 功能之前,这曾经很常见。Cristik’s answer 是实现诸如系统之类的良好起点。

【讨论】:

我倾向于同意你的观点,但在这种情况下,我需要继续运行一个计时器,如果它在用户背后停止,那么应用程序将毫无用处。不过,我会尽量减少这种情况。谢谢! 诡计决定。我将其视为用户明确停止您的应用程序,因此我可能希望计时器停止。我对应用程序连环杀手没有什么同情心。 这在您的应用中可能没有意义,但如果您始终可以保存计时器(即用户数据)但在杀死的情况下会丢失 UI 状态,那么值得考虑。 是的,我正试图在不破坏功能的情况下尽可能少地节省开支。不过,你确实说服了我不要过度。我在想“好吧,既然我必须自己保存东西,我还不如一路走下去”。那谢谢啦。 :)

以上是关于每次都恢复状态?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 恢复 Fragment WebView 状态以避免重新加载

H2 数据库恢复到特定状态进行测试

如何在可可中保持应用程序状态

在 xamarin 表单中保存和恢复应用程序状态

如何在 Android Lollipop 中保存 WebView 状态并恢复它?

如何在 Android Lollipop 中保存 WebView 状态并恢复它?