保留Textview状态

时间:2015-03-23 12:41:11

标签: ios xcode storyboard

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

场合

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

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

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

问题

在视频控制器1中,用户在“text_field_1”中输入内容,

然后segue查看控制器2,用户在“text_field_2”中输入内容,

然后返回使用导航控制器查看控制器1,保留“text_field_1”中输入的文字

然后

再次查看控制器2,但“text_field_2”中输入的文字未保留

我想要实现的目标

有没有办法在“text_field_2”中保留文字?

3 个答案:

答案 0 :(得分:1)

这是正常行为导致一旦弹出视图控制器2,它就会被取消分配。您的问题有几种解决方案:

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

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

答案 1 :(得分:1)

VC1是您的“原始”视图控制器。然后它创建一个VC2的实例,将其推送到导航堆栈并显示。当您按下后退按钮时,它会关闭导航堆栈并被销毁。原始VC1仍然在后台,完好无损。再次转换为VC2会导致创建{em>新 VC2实例,因此会显示空文本字段。

如果您希望VC2中的文本字段的值保持不变,则需要手动将其存储在您自己创建的文件NSUserDefaults,核心数据或其他任何内容中。

答案 2 :(得分:0)

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

为什么一旦弹出它们,视图控制器就会丢失它们的值?

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

  

视图控制器是模型 - 视图 - 控制器(MVC)设计模式中的传统控制器对象,[...]

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

  

控制器对象充当应用程序的一个或多个视图对象与其一个或多个模型对象之间的中介。因此,控制器对象是视图对象通过其获知模型对象的变化的管道,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。

     

通信:控制器对象解释在视图对象中进行的用户操作,并将新的或更改的数据传递给模型层。当模型对象发生变化时,控制器对象会将新模型数据传递给视图对象,以便它们可以显示它。

特别是,视图控制器不是模型对象。他们不应该持有(除了瞬态)数据。

每当你弹出一个视图控制器时,它都会被释放,因为它不应该保存持久数据。