【问题标题】:iOS - Views (ViewController), having persistent dataiOS - 视图(ViewController),具有持久数据
【发布时间】:2018-10-07 12:21:19
【问题描述】:

我目前正在使用 Xcode/swift 4 开发一个应用程序,我需要一个视图(我们称之为 loggerView),它不是主视图,以便能够从主视图(或其他视图)中获取数据一种允许在显示 loggerView 时显示所述数据的方式(在这种情况下使用文本视图)。我知道在转换到 loggerView 时,我可以使用 segue 将此数据(文本日志消息)呈现/推送到 loggerView,但有几个问题:

  1. 使用 segue 时,数据只能在转换时通过 segue prepare 一次全部推送,而不是我需要的零碎的。

  2. 当用户退出 loggerView 回到主(或其他)视图时,loggerView 中的所有数据都会丢失。

因为 (2) 我需要主视图来存储与我希望在 loggerView 中显示的信息相关的所有日志记录数据,这样每次都可以提供所有数据。这并不理想,因为我不希望主视图存储它,我正在寻找一种将这些数据触发到 loggerView 的方法,就像委托可能从 loggerView->primaryView 中调用它一样显示 loggerView 时的任何时间。

我认为这里的主要问题是我正在使用父视图原位(使用导航控制器),每次我们从子视图转换回父视图时,子视图(在这种情况下为 loggerView)都会从内存中删除因此与 loggerView 相关的所有数据都被删除,因此每次打开 loggerView 时都需要对所有内容进行 segue。

有没有办法让多个视图永久化(内存方面),然后在 primaryView 和其他视图之间临时发送数据,而不是像委托可能反向工作的方式(loggerView->primaryView)?

【问题讨论】:

  • 我不明白您反对将孩子的数据存储回父级。这是正常和标准的。如果您坚持与众不同,为什么不将其保留在 UserDefaults 中?
  • 我认为这归结为项目的架构概述,也许我需要在这里改变思维方式。如果在这种情况下子视图只是一个 ViewController,其工作只是显示从应用程序的任何其他部分发生的日志消息,那么在这种情况下将子视图视为所述数据的存储器可能没有用,但是而是创建一个单独的存储容器,将日志传递到其中,然后,当父视图切换到子视图时,让它将这个单独的存储容器作为 segue 的一部分传递给子视图?
  • 这是平常的事情。 — 基本上,认为视图控制器是灵活的;他们的目的是来来去去,因为他们控制的观点来来去去。因此,如果您有需要持久化的数据,则需要将其传递出去,或者放在更持久的地方。模型、视图、控制器。三种不同的东西。不要试图把控制器变成模型!
  • 将讨论总结为实际答案。

标签: ios swift uiviewcontroller viewcontroller


【解决方案1】:

总结我们在 cmets 中的讨论:

您反对将孩子的数据存储回父级可能是错误的。这种行为是正常和标准的。如果您坚持与众不同,您可以将数据保存在 UserDefaults 中,既是全局的又是持久的,但这通常被视为拐杖。

实际上,您希望保留视图控制器只是为了保留从用户那里获取的一些数据是错误的。假设弹出一个对话框,要求您输入名称。您输入名称并点击确定,对话框就会消失。你不相信对话应该在幕后坚持只是为了保持名字,是吗?不——保留的是名称。该对话框以及使其出现的所有机制只是为了管理用户界面而临时使用的。

在工作时一遍又一遍地向自己重复“模型视图控制器”(MVC) 可能会有所帮助。从用户那里收集的数据是模型。如果您希望它持续存在,请坚持it。但是不要仅仅为了做到这一点而持久化视图控制器。将视图控制器视为灵活;他们的目的是来来去去,因为他们控制的观点来来去去。如果您有需要持久化的数据,则需要将其传递出去,或者放在更持久的地方。模型、视图、控制器。三种不同的东西。不要试图把控制器变成模型!

【讨论】:

  • 很公平。谢谢总结。
  • 抱歉,在重新阅读您的评论时,我意识到您的印象是,在这种情况下,数据来自用户。这里根本没有用户参与。简单地说,某个线程上运行着一些“引擎”,它时不时地吐出日志消息。这些日志消息现在将被推送到一些主数据存储中,并且无论何时打开子视图,它都会显示它们。但是......似乎仍然存在一个限制,即当子视图打开时,如果不先关闭视图并再次打开它,它就不会看到推送的任何其他日志?
  • 没有固有限制。同样,这是视图控制器之间的通信问题。引擎需要发送消息,以便该子视图控制器可以接收它们(如果存在)。再说一次,仅仅为了做到这一点而让子视图控制器持续存在是错误的。
  • 所以我认为正是您提到的这些“信息”可能会解决我的需求?我不知道在子视图当前打开时获取信息的方法,而不是在创建时。关于它是错误的,那么它可能是一个架构问题?在我的情况下,主视图控制器充满了一堆控制的东西,并且没有“空间”用于记录窗口。当我启动引擎时,我需要转到日志记录(子视图)并观察引擎的进度。
  • “我不知道有什么方法可以在子视图当前打开时获取信息,而不是在创建时。”那么也许你需要问一个关于这个的新问题。有很多方法可以做到这一点。换句话说,如果您仅仅因为不了解如何在视图控制器之间传递数据/消息而试图以一种糟糕的方式进行编程,那么您需要停下来学习如何在视图控制器之间传递数据/消息,以便您可以以正确的方式编程。同时,我相信我已经充分回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多