【问题标题】:Why does my view in a Navigation Controller clear after hitting the back button?为什么我在导航控制器中的视图在点击后退按钮后会清除?
【发布时间】:2016-04-03 18:38:27
【问题描述】:

我在导航控制器中有两个 UITableViewController,其中包含用于表单的静态单元格。我有一个从第一个视图上的单元格到第二个视图的显示切换,但是当我在第二个视图上点击后退按钮时,第二个视图中的文本字段和选择器中的所有数据都被删除。为什么会这样,我该如何解决?

【问题讨论】:

  • 显示清除的视图控制器的代码。
  • 没什么有趣的,只是一个标准的 UITableViewController。
  • 标准表格视图控制器不会删除所有单元格数据。
  • 不是单元格中的数据,而是文本字段和开关。我认为它每次都在创建第二个视图控制器的新版本,而不是切换回来和第四个。不过我可能是错的。
  • 啊,我明白了,second 视图控制器是问题所在。是的,第二个是重新创建而不是重复使用。只需在第二个视图控制器中使用基本 print("deinit called") 实现 deinit,您可以自己检查。

标签: swift uinavigationcontroller navigation


【解决方案1】:

每次执行从第一个视图控制器到第二个视图控制器的 segue 时,都会创建第二个视图控制器。因此,每次新建时都会重新创建第二个视图控制器的初始状态。请参阅此答案以更好地了解该过程(这是问题 3 的答案):

iOS Segue - When are the viewControllers Instantiated

您有很多选择来解决这个问题。例如:

  • 将数据存储在磁盘上的第二个视图控制器中(例如,使用 NSUserDefaults)并在每次创建视图控制器时重新创建
  • 将第二个视图控制器的实例存储在第一个视图控制器中,不要继续使用它,而是调用self.navigationController?.pushViewController 打开第二个视图控制器
  • 等等……

【讨论】:

  • 我可能最终会使用第一个选项,但第二个选项需要我创建第二个视图控制器的新实例。我做错了吗,还是应该只使用第一种方法?
  • 使用第二个选项,您将每次重用曾经创建的实例。但是,如果您更喜欢这个,请选择选项一。
  • 我得到了第二种方法,我每次都创建一个新实例而不是作为类变量。非常感谢您的帮助,我真的很感激。我还没有足够的声望来投票给你的答案,但我会尽可能地投票。
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多