在重新启动时保留应用程序状态

时间:2008-11-30 22:26:59

标签: iphone cocoa-touch

我一直试图通过使用UITabBarController序列化我的主[NSKeyedArchiver archiveRootObject:toFile:]来保留我的iPhone应用程序的状态,但我遇到了困难。

首先我遇到了UIImage的问题,因为它没有实现NSCoding协议,但我通过为存储和检索原始数据的UIImage创建扩展类别来解决这个问题。图像数据。

我现在遇到的问题是,当我从存档恢复时,我的视图控制器不存在。我的每个标签中都有UINavigationControllers,当我恢复时,UINavigationItem仍然存在(我可以使用“返回”按钮等来更改它们),但视图控制器刚刚消失。

我发现UINavigationController的{​​{1}}属性已标记为viewControllers。这是否意味着当您归档(nonatomic, copy)时,它不包括其视图控制器堆栈?如果是这样,我怎么能解决这个问题呢?我首先想到我会覆盖UINavigationController的{​​{1}}方法,但这会搞砸NIB文件的初始化。

我有点不安,因为我在保持应用状态方面遇到了这么大的困难。我认为这是一个很常见的用例,它可以直接实现。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:5)

@property上的属性与归档行为几乎没有任何关系(它们只描述了getter和setter的工作方式)。

另外,仅仅因为UI类支持NSCoding,并不意味着它可以用于重建状态。大多数情况下,它们支持NSCoding,因此可以使用Interface Builder从NIB文件构造和加载它们。如果您考虑在无法设置的所有状态位 - 该类的NSCoding实现可能不支持任何数量的这些功能。

通常,人们不使用NSCoding存储应用程序状态,因为应用程序状态的确切构成特定于您的应用程序。

保存应用程序状态通常涉及自己存储值,以便您重新创建状态。即存储所选标签的索引或表示通过导航控制器的路径的一系列选定索引。

答案 1 :(得分:5)

为什么要尝试存档整个标签栏控制器?只需使用NSUserDefaults并保存选定的选项卡索引。然后,在加载应用程序时,根据保存的值选择选项卡索引。

答案 2 :(得分:3)

我也从来没有能够采用这种方法。我所拥有的是拥有自己的协议,并让每个视图控制器保存/恢复该视图所需的元数据(例如,您不需要保存图像数据,只需保存图像的名称)。一旦你拥有了它,它就可以很容易地编写一些通用代码来遍历导航控制器(+堆栈)并保存/恢复整个数据集。听起来很多工作,但实际上很容易。