代码之家  ›  专栏  ›  技术社区  ›  Lawrence

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

  •  5
  • Lawrence  · 技术社区  · 16 年前

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

    首先我有个问题 UIImage ,因为它没有实现 NSCoding 协议,但我通过为 紫外图像 它存储和检索原始图像数据。

    问题是,当我从存档中恢复时,视图控制器不在那里。我有 UINavigationControllers 在我的每个选项卡中,当我恢复时, UINavigationItem S仍然在那里(我可以使用后退按钮等来更改它们),但是视图控制器已经不在了。

    我明白了 UINavigationController viewControllers 属性已标记 (nonatomic, copy) . 这是否意味着当你将 ui导航控制器 ,它不包括它的视图控制器堆栈吗?如果是的话,我怎么能避开这个?我第一次想到我会超越 非编码 方法 ui导航控制器 但这会破坏NIB文件的初始化。

    我有点不安,因为我一直很难保存应用程序状态。我认为这是一个非常常见的用例,可以很容易地实现。我是不是错过了什么?

    3 回复  |  直到 12 年前
        1
  •  5
  •   Matt Gallagher    16 年前

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

    而且,仅仅因为UI类支持nscoding,并不意味着它可以用于重构状态。大多数时候,它们支持nscoding,这样就可以使用接口生成器从NIB文件构造和加载它们。如果你考虑到你 不能 在接口生成器中设置——nscoding类的实现可能不支持这些功能中的任何数量。

    通常,人们不会使用nscoding来存储应用程序状态,因为构成应用程序状态的确切内容是特定于应用程序的。

    保存应用程序状态通常需要自己存储允许您重新创建状态的值。即存储所选选项卡的索引或表示通过导航控制器的路径的一系列所选索引。

        2
  •  5
  •   August    16 年前

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

        3
  •  3
  •   superfell    16 年前

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