IOS保存复杂应用程序的状态

我正在iPad IOS 4.2:4选项卡上构build一个相当复杂的业务应用程序,每个选项卡上的潜在深度导航path。

一些更有经验的IOS开发人员认为,在启动之间保存应用程序状态(即在应用程序被完全终止并随后重新启动之后),用户的一般期望是什么? 我正在使用核心数据,并涵盖了所有的数据问题,但是我担心应用程序的导航树。 如果用户已经离开了屏幕3上的第一个标签,屏幕4上的第二个标签,屏幕3上的第三个标签,在那里他离开了新logging的一半完成,并且在应用进入背景时,在屏幕3上的第4个选项卡上工作…您是否认为普通用户希望应用程序在下次启动时记住所有内容? (我的直觉是肯定的,虽然我不确定多久。)

如果答案是肯定的,你可以提出一个处理这个问题的总体策略(而且,我在这里讨论的是导航树,而不是核心数据)。 例如,如果导航控制器被用作每个选项卡的根视图控制器,那么足够简单地logging关于其导航堆栈的足够信息以便能够稍后恢复它们。 但是呢,像弹窗,警报/行动表,或模式风险投资创build的东西呢? 每个视图控制器是否应logging其UI对象的状态,如果是,则build议如何执行此操作?

我知道这很大程度上取决于用户,但我要求对这些问题的总体看法,即经验之谈。

谢谢,

韦恩

原则上这很简单,但在实践中可能会变得非常复杂,以便浏览导航层次结构并存储无法从数据模型派生的内容。

这个名为DTResurectionKit的开源实现。 我还logging了我在我的网站上的应用程序中如何执行此操作 。 它类似于(但比DTResurectionKit简单)。

在您的一些更有经验的IOS开发人员看来,对于在启动之间保存应用程序状态,用户的一般期望是什么?

想想这个的最好方法就是确保用户在开启应用程序时,不必知道为什么或如何到达目的地。

这完全取决于您所拥有的应用types以及自上次打开以来的时间长度。 这听起来像你有一个相当复杂的钻取应用程序,所以我认为最好是在预先确定的时间框架内记住导航堆栈。 我使用这个自动为我做的这个three20框架,但是如果你要实现它,将会是这样的:

  1. 如果用户在过去的24小时内打开,请打开确切的位置
  2. 如果用户在一周内打开,打开主要的“部分”或应用程序的区域
  3. 如果用户在一周之后打开,则打开根目录。

当然,这些值会根据您的应用程序function和用例而有所不同,但您明白了。 通过对人们如何使用您的应用程序以及何时进行一些广泛的假设,您可以在应用程序不深入的情况下增加用户体验,因为他们不记得如何到达那里。

至于实现,这只是数据..你不需要序列化活动对象来存储堆栈,只需实现在下一次启动时重新创build状态所需的数据。 你需要存储的是高度依赖于你自己的设置…里程将有所不同。 我使用NSUserDefaults通过Three20存储所有实例variables和导航堆栈。 检查一下TTNavigator的一个很好的实现。

我会build议保持每个标签视图的状态。 只在“页面”级别。 不要担心popovers或不完整的数据input(希望在将其保存到核心数据存储之前,没有太多的临时状态)。

就像你说的,很容易记住你正在使用哪个标签,以及你在每个标签中导航到哪个控制器。 更多是没有必要的。

这听起来像是你已经掌握了它,但为了别人的利益:1)当你改变标签,保存“活动标签”,2)当你在一个标签内导航,保存“活动控制器在标签”,3)当你启动应用程序,设置“活动选项卡”,4)当你改变标签,设置/确认“在主动控制器在选项卡”。

4)的原因是选项卡的视图/控制器将在加载时被延迟,或者可能从未加载。 您不希望将标签中的“活动控制器”设置为不可见,并且可能永远不会加载到应用程序中的选项卡,这只会导致不必要的加载。 它会经常发生(应用程序加载后),您不需要更改它,因为它已经处于正确的状态。

我觉得你的时间在别处花得更好。 当然,你的应用可能完全适合这个,但是在我们的例子中,数据部分是在线的,可能已经过时,在不同的标签中同时在不同的导航视图中影响了视图状态等等。这不是一个无法克服的挑战,而是绝对的困难和巨大的时间沉没。

我们决定花时间来修复错误并改进function。 如果你必须做出同样的select,我很确定你的用户更喜欢哪个选项。 特别是现在,您的应用程序将在后台通话。