【发布时间】:2010-12-21 04:00:57
【问题描述】:
我开发了一个带有标签栏和导航控制器的 iPhone 应用程序。
目前一切正常。
现在我希望应用程序在退出前保存其状态。
假设我有 6 个标签,如果有来电,那么在重新启动应用程序后,我应该会看到最后选择的标签。
我看过几个关于这个主题的问题,但看到它们后我更加困惑,
谁能告诉我一个直接的方法来做到这一点?
【问题讨论】:
标签: iphone uitabbarcontroller state
我开发了一个带有标签栏和导航控制器的 iPhone 应用程序。
目前一切正常。
现在我希望应用程序在退出前保存其状态。
假设我有 6 个标签,如果有来电,那么在重新启动应用程序后,我应该会看到最后选择的标签。
我看过几个关于这个主题的问题,但看到它们后我更加困惑,
谁能告诉我一个直接的方法来做到这一点?
【问题讨论】:
标签: iphone uitabbarcontroller state
没有“一刀切”,这个问题的确切答案 - 保存应用程序状态的实现很大程度上取决于应用程序的结构,因此任何单一的解决方案都不太可能适合您的具体情况。
不过,有一些一般性的提示和提示可以帮助您走上正确的道路来开发良好的状态保持解决方案:
您通常需要执行任何操作以将状态保存在您的应用委托中的 applicationWillTerminate: 中,或者通过侦听其他类中的 UIApplicationWillTerminateNotification。
Look at NSUserDefaults. 您可以使用 NSUserDefaults 存储与偏好或其他信息相关的键/值对(类似于 NSDictionary,尽管您只能在 NSUserDefaults 中存储实现 NSCoding 的对象)。使用 NSUserDefaults 存储状态信息。一个警告 - 你不应该使用 NSUserDefaults 来存储大量数据,因为这会减慢你的应用程序的启动时间(因为这些值是在启动时加载的)。
更具体到您的情况...如果您只想在应用程序之间保留选定的选项卡,您应该实现 applicationWillTerminate: 并使用 NSUserDefaults 来存储选定的选项卡索引。然后,在您的 applicationDidFinishLaunching: 实现中,您将检查该 NSUserDefaults 键是否存在,并将 UITabBarController 的选定索引设置为存储的值(如果存在)。
如果您还希望能够恢复,例如,所选选项卡的导航堆栈,那么您需要存储足够的信息,以便可以准确地重建导航堆栈。您应该在 NSUserDefaults 中存储哪些信息很难在一般意义上进行量化,因为它高度特定于您的应用程序的结构以及导航堆栈中视图控制器层次结构的可能迭代。
如果您需要恢复更通用的导航堆栈,包括您不希望在应用程序关闭时丢失的可能输入的用户数据(例如,如果用户正在创建某种新记录),我建议您将注意力从在应用程序委托级别存储应用程序状态转移到让您的视图控制器类监听UIApplicationWillTerminateNotification 并进行自己的特定状态保存。您还必须确定某种机制,以便在终止时使用每个视图控制器保存的信息来恢复导航层次结构。这是一种更复杂的技术,根据您的需要可能不需要。
不幸的是,这个答案有点模糊,尤其是对于更一般和更复杂的情况,因为正如我所指出的,这个问题没有通用的解决方案,因为它在很大程度上取决于您的应用程序结构。
这是一个使用 NSUserDefaults 的示例:http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847
【讨论】: