保留 Textview 状态

Peserve Textview State

这应该很容易,但我还无法弄明白。

情况

查看控制器 1(文本字段:text_field_1)

查看控制器 2(文本字段:text_field_2)

从视图控制器 1 到视图控制器 2 有一个 "show segue",还包括导航控制器。

问题

在查看控制器 1 中,用户在 "text_field_1"、

中键入内容

然后继续查看控制器 2,用户在 "text_field_2"、

中输入内容

然后使用导航控制器返回视图控制器 1,在 "text_field_1" 中输入的文本被保留

然后继续查看控制器 2,但是 在 "text_field_2" 中输入的文本没有被保留

我想达到的目标

有什么方法可以保留 "text_field_2" 中的文本吗?

这是正常行为,因为一旦弹出视图控制器 2,它就会被释放。您的问题有多种解决方案:

  • 要么创建一个委托,在 VC2 文本字段文本更改时通知 VC1,将此值存储在 VC1 中,并在再次触发 show segue 时将此值传递给 VC2。在您的 VC2 viewDidLoad: 方法中,检查此值是否为 nil ;如果没有,请设置您的 text_field_2 默认文本。
  • 在您的 VC2 中,将文本字段文本保存到 viewWillDisappear:(例如)方法中的 NSUserDefaults 中,并在加载时检查是否可以从 NSUserDefaults 中检索值。如果是,请设置您的 text_field_2 文本值。

如果您需要解决方案 1 或 2 的源代码示例,请告诉我。

VC1 是您的 'original' 视图控制器。然后它创建一个 VC2 的实例,该实例被推送到导航堆栈并显示。当您按下后退按钮时,它会弹出 off 导航堆栈并销毁。原来的 VC1 还在后台,完好无损。再次过渡到 VC2 会导致创建 VC2new 实例,因此文本字段为空。

如果您希望 VC2 中文本字段的值保持不变,您需要手动将其存储在您自己创建的文件、NSUserDefaults、Core Data 或其他文件中。

虽然所有给出的答案都是正确的,但它们并没有解释手头的问题:

为什么弹出视图控制器后它们的值会丢失?

视图控制器在 Cocoa 应用程序的 MVC 设计中扮演着特定的角色。正如 official Apple documentation 所说:

View controllers are traditional controller objects in the Model-View-Controller (MVC) design pattern, [...]

因此,他们负责将值从底层模型移交给他们的视图并将更改传播回模型层:

A controller object acts as an intermediary between one or more of an application’s view objects and one or more of its model objects. Controller objects are thus a conduit through which view objects learn about changes in model objects and vice versa. Controller objects can also perform setup and coordinating tasks for an application and manage the life cycles of other objects.

Communication: A controller object interprets user actions made in view objects and communicates new or changed data to the model layer. When model objects change, a controller object communicates that new model data to the view objects so that they can display it.

特别是,视图控制器不是模型对象。它们不应保存(瞬态除外)数据。

无论何时弹出视图控制器,它都会被释放,因为它不应该保存持久数据。