Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 每次恢复状态?_Ios_Swift_Appdelegate_State Restoration - Fatal编程技术网

Ios 每次恢复状态?

Ios 每次恢复状态?,ios,swift,appdelegate,state-restoration,Ios,Swift,Appdelegate,State Restoration,我的应用程序有一个视图控制器,即使用户自己杀死了该应用程序,它也必须被还原,而shouldRestoreApplicationState不会这样做;如果用户杀死了应用程序,我会回到第一个控制器 那么,有没有办法做到我想要的,每次都恢复状态 如果状态恢复无法做到这一点,我想也许我可以将视图控制器保存到持久性存储中,并从appDelegate中显示它,但我还没有弄清楚这一点。我必须从appDelegate重建整个导航堆栈,包括一个选项卡栏控制器和多个导航控制器,直到该视图。这是个好主意吗?我该怎么做

我的应用程序有一个视图控制器,即使用户自己杀死了该应用程序,它也必须被还原,而
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)
但我不断地犯各种错误

理想情况下,我希望恢复每个视图控制器的状态,但每次都必须恢复。有更好的方法吗

谢谢


丹尼尔

反对这种标准行为可能是个坏主意。如果你的应用程序中有一个bug,并且它一直在恢复坏状态并陷入困境,那么这种行为就是存在的


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

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

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

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


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

请注意,
UINavigationController
有一个可以设置的属性。如果您将您的
rootViewController
设置为
UINavigationController
,然后重新创建视图控制器链,您可以一次将它们全部设置,最后一个是可见的。我倾向于同意您的看法,但在这种情况下,我需要一个计时器来保持运行,如果它在用户背后停止,应用程序将非常无用。不过,我会尽量把它控制在最低限度。谢谢诡计决定。我把它看作是用户明确停止你的应用程序,所以我可能希望计时器停止。我对应用程序连环杀手没有什么同情心。这在你的应用程序中可能没有意义,但值得考虑的是,如果你总是可以保存计时器(即用户数据),但在发生杀戮时却会丢失UI状态。是的,我正试图在尽可能少地保存而不破坏功能之间找到一个最佳点。不过你确实说服我不要做得太过分了。我在想,“既然我得自己保存东西,我还是一路走吧。”。所以,谢谢