iOS 应用程序如何在多个屏幕之间保留数据?

4

我有一些数据字符串来自我的应用程序的一个屏幕,我想将其存储(在一个模型中),然后在用户返回到同一页时检索。目前数据已经存储在模型中,但是,我遇到了一个问题,因为似乎每次返回到屏幕时都会生成一个新的控制器实例。因此,我的模型没有任何作用,因为我失去了对它的引用(它当前作为控制器内的实例变量存储)。我做错了什么?

4个回答

3
“我做错了什么?”
通常情况下,您会拥有一个模型(可能是一组对象,不一定只是一个),该模型在您的文档或应用程序中共享。创建视图控制器时,会将其赋予模型的引用(或某个模型的一部分)。如果它又创建了另一个视图控制器,则会将模型的引用传递给该对象。因此,所有视图控制器都共享该模型。当视图控制器被解除分配时,模型并不会被遗忘,因为其他控制器知道它。
听起来您已经开始使用一个模型,但它仅限于单个视图控制器。也许您的其他一些视图控制器也面临相同的情况。思考如何将所有这些小模型连接成一个更大的对象图。这将使它更容易记住,并允许您将保存整个模型的责任放在像您的应用程序委托或根视图控制器这样的单个对象中。

0

看起来你需要将模型数据持久化到磁盘上,可能使用NSUserDefaults,这是最适合像这样小量数据的存储机制。


我的控制器每次都需要重新创建吗?我的故事板只有一圈箭头,允许用户在一个圆形中导航。 - Nosrettap
@nosrettap,这是你的问题。你不应该将另一个原始控制器实例推入堆栈。你应该弹出其他实例,以返回到原始控制器的原始实例。 - Rob
请参考这个SO讨论,了解从堆栈中弹出视图控制器的正确方法。 - Rob

0

你至少可以考虑以下几个选项:

  1. 像Andrew所说的那样,通过NSUserDefaults将数据持久化到磁盘。
  2. 使用单例设计模式创建一个数据“管理器”对象,该对象将在应用程序的生命周期内持久化数据。
  3. 尝试找出为什么会创建一个新的视图控制器实例(根据你的代码,这可能很明显或不太明显),并尝试以稍微不同的方式重用视图控制器(根据你的代码,这可能很简单或很困难)。

考虑到你正在使用你的评论中描述的故事板,我建议选择选项2,除非你真正想改变你的视图控制器的导航模式。


如果我将一个控制器推到导航控制器堆栈上,当我将它弹出时,它是否会保留或创建一个新实例? - Nosrettap
1
为什么要使用用户默认设置?我们不知道有多少数据。默认系统很容易使用,但很多人认为这样使用是滥用。 糟糕。 释放控制器并没有什么异常的地方,也没有理由保留它。持久化模型是重要的;视图控制器则不然。 - Caleb
@Nosrettap,当你将一个控制器推到栈上时,旧的控制器仍然存在。当你弹出栈顶的最后一个控制器时,旧的控制器仍然存在(但是当你弹出它时,它的数据将不复存在,除非你将其存储在持久存储区(或单例)中)。 - Rob
@Caleb 1) 当然,对于这种用法来说,它似乎不是一个很好的选择。2) 单例有其存在的意义,并且在传递引用的替代方案需要从代码中传递各种组合的引用到许多视图控制器时可能会有优势...你想要将对 NSNotificationCenter 的引用传递给每个需要使用它的对象吗?3) 我同意。视图控制器需要持久化的唯一时间是在维护其包含的视图/控件的状态时,当数据不在模型中或不应该在模型中时。 - Matt

0
当您将视图控制器推入导航控制器中,然后返回到它时,它会保留。但是如果您想要一些数据在多个屏幕之间保持单例实例是一个好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接