如何在终止应用程序之前保留iPhone应用程序状态?

时间:2009-11-28 05:39:08

标签: iphone uitabbarcontroller state

我开发了一个带标签栏和导航控制器的iPhone应用程序。

现在工作正常。

现在我希望应用程序在退出之前保存其状态。

假设我有6个标签,如果有来电,那么在重新启动应用后,我会看到最后选择的标签。

我已经看过几个关于这个主题的问题,但看到它们后我更加困惑,

谁能告诉我一个直接的方法呢?

1 个答案:

答案 0 :(得分:27)

没有“一刀切”,这个问题的确切答案 - 保存应用程序状态的实现将在很大程度上取决于应用程序的结构,以便任何单个解决方案都不太适合您的特定情况。 / p>

然而,有一些一般的提示和指示,应该让你走上正确的道路,开发一个良好的状态保留解决方案:

  1. 您通常希望执行任何操作以在应用委托中applicationWillTerminate:保存状态,或者在其他课程中监听UIApplicationWillTerminateNotification

  2. Look at NSUserDefaults.您可以使用NSUserDefaults存储与首选项或其他信息相关的键/值对(类似于NSDictionary,尽管您只能存储在NSUserDefaults中实现NSCoding的对象)。使用NSUserDefaults存储状态信息。一个警告 - 您不应该使用NSUserDefaults来存储大量数据,因为这会减慢应用程序的启动时间(因为值在启动时加载)。

  3. 更具体的情况......如果您只想在应用程序之间保留选定的选项卡,则应实现applicationWillTerminate:并使用NSUserDefaults存储选定的选项卡索引。然后,在applicationDidFinishLaunching:实现中,您将检查是否存在该NSUserDefaults键,并将UITabBarController的选定索引设置为存储值(如果存在)。

  4. 如果您希望能够恢复所选标签的导航堆栈,那么您需要存储足够的信息,以便可以准确地重建导航堆栈。您应该在NSUserDefaults中存储哪些信息在一般意义上难以量化,因为它非常特定于应用程序的结构以及导航堆栈中视图控制器层次结构的可能迭代。

  5. 如果您需要恢复更常规的导航堆栈,包括在应用程序关闭时您不希望丢失的可能输入的用户数据(例如,如果用户正在创建某种新记录) ),我建议您将注意力从存储应用程序委托级别的应用程序状态转移,而是集中精力让视图控制器类监听UIApplicationWillTerminateNotification并执行自己的特定状态保存。您还必须确定一些机制,以便在终止时使用每个视图控制器保存的信息来恢复导航层次结构。这是一种更复杂的技术,根据您的需要可能没有必要。

  6. 不幸的是,这个答案有点模糊,特别是对于更一般和复杂的情况,因为我注意到这个问题没有通用解决方案,因为它在很大程度上取决于你的应用程序结构。

    以下是使用NSUserDefaults的示例:http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847