如何将来自多个视图控制器的数据保存到单个核心数据实体中
Posted
技术标签:
【中文标题】如何将来自多个视图控制器的数据保存到单个核心数据实体中【英文标题】:How to save data from multiple view controllers into a single core data entity 【发布时间】:2017-07-11 19:39:55 【问题描述】:我有一个实体,它具有从 5 个视图控制器填充的属性。
该应用程序基本上是一个包含 5 个问题的基于详细表单的问卷调查,5 个视图控制器中的每一个都包含一个问题及其一组答案选项。在前 4 个中,用户有多项选择题。在最后一个问题中,用户可以从选项集中选择多个值。
我为每个视图控制器维护了一个实体,以便为该视图控制器显示选项。
为了捕获用户的答案,我创建了一个名为 Answer 的实体,其中包含用于回答前 4 个问题的字符串属性以及与第五个实体的关系,以便我可以捕获用户为第 5 个问题选择的一组答案。
当用户从第一个问题转到第二个问题到第三个问题时,我还需要保存用户选择,而不是在用户回答完所有问题后一次性保存。
此外,如果他弹出第一个问题的屏幕,用户可以放弃答案。
实现它的最佳方法是什么?
我正在寻找以下选项 -
-
在进入第一个问题视图控制器之前创建一个答案实体记录。也是一个托管对象上下文(moc)。然后,我在 5 个视图控制器中的每一个中保留一个 moc 属性,然后将在从第一个控制器到第五个控制器的第一个控制器之前创建的 moc 与 Answer 托管对象一起传递。每当用户从一个问题转到下一个问题时,保存在这个 moc 中。
创建一个 DataCollector 类型的 Singleton 类,其中我有一个用于创建 Answer 实体记录的 init 方法以及用于创建 moc 和保存到 moc 的方法。然后,从每个问题中,我都会引用这个 Answer 托管对象并共享同一个 moc。
请指教。
【问题讨论】:
选项 1 是我会做的。 【参考方案1】:我能看到的最简单的方法是使用 prepare(for segue:) 方法将所有答案传输到下一个视图控制器。你可以这样说
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let secondScene = segue.destination as! (nextController)
secondScene.answerQuestion1(declared variable in nextController) = (value you are transferring)
当你移动到下一个 UIView 时,在视图控制器中,在类声明之后你可以简单地声明你想要存储值的变量,所以对于下一个问题对应的 UIView,
class QuestionTwo: UIViewController
var answerQuestion1
override func viewDidLoad()
super.viewDidLoad()
对所有视图控制器重复此操作,到第 5 个时,您将获得前 4 个问题和第 5 个问题的所有答案,此时您可以将其保存在 CoreData 中并然后清除变量中的值。
【讨论】:
以上是关于如何将来自多个视图控制器的数据保存到单个核心数据实体中的主要内容,如果未能解决你的问题,请参考以下文章