每次都恢复状态?
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 defaults
:bookmarks.folder1.subfolder2.file18.playing.position=19.28
。这可能对应于正在播放的视频文件,并在应用程序崩溃或被操作系统终止之前达到 19.28 秒。
通过使用上述模式,您可以将控制器恢复到非常接近上次会话结束之前的状态。最棒的是,用户甚至不必知道您的应用程序已经重新开始,他将获得与上次浏览应用程序时相同的体验。
当然,恢复取决于应用程序的复杂程度,并且可能不适用于应用程序内的所有流程,但是对于这种情况,您至少可以将用户带回到更接近退出前的应用程序状态。
【讨论】:
【参考方案2】:反对这样的标准行为可能是个坏主意。如果您的应用程序中存在错误并且它会不断恢复不良状态并卡住,就会出现这种行为。
如果你真的想这样做,你不能使用 UIKit 的状态恢复系统,所以你必须自己构建。在 ios 6 中添加 UIKit 功能之前,这曾经很常见。Cristik’s answer 是实现诸如系统之类的良好起点。
【讨论】:
我倾向于同意你的观点,但在这种情况下,我需要继续运行一个计时器,如果它在用户背后停止,那么应用程序将毫无用处。不过,我会尽量减少这种情况。谢谢! 诡计决定。我将其视为用户明确停止您的应用程序,因此我可能希望计时器停止。我对应用程序连环杀手没有什么同情心。 这在您的应用中可能没有意义,但如果您始终可以保存计时器(即用户数据)但在杀死的情况下会丢失 UI 状态,那么值得考虑。 是的,我正试图在不破坏功能的情况下尽可能少地节省开支。不过,你确实说服了我不要过度。我在想“好吧,既然我必须自己保存东西,我还不如一路走下去”。那谢谢啦。 :)以上是关于每次都恢复状态?的主要内容,如果未能解决你的问题,请参考以下文章
Android - 恢复 Fragment WebView 状态以避免重新加载