如何将来自多个视图控制器的数据保存到单个核心数据实体中

时间:2017-07-11 19:39:55

标签: ios core-data nsmanagedobject nsmanagedobjectcontext nsmanagedobjectmodel

我有一个实体,其中包含从5个视图控制器填充的属性。

该应用程序基本上是一个详细的基于形式的问卷,有5个问题,5个视图控制器中的每一个都包含一个问题及其答案选择集。在前4位,用户有多项选择题。在最后一个问题中,用户可以从选项集中选择多个值。

我为每个视图控制器维护了一个实体,以便为该视图控制器显示选项。

为了捕获用户的答案,我创建了一个名为Answer的实体,其中包含用于回答前4个问题的字符串属性以及与第五个实体的关系,以便我可以捕获用户为第5个问题选择的答案选项集。

我还需要保存用户选择,当用户从第一个问题移动到第二个问题到第三个问题时依此类推,当用户回答完所有问题时,我不需要一次性保存用户选择。

此外,如果用户弹出第一个问题的屏幕,用户可以放弃答案。

实现它的最佳方式是什么?

我正在寻找以下选项 -

  1. 在进入第一个问题视图控制器之前创建一个答案实体记录。也是一个托管对象上下文(moc)。然后,我在5个视图控制器的每一个中保留一个moc属性,然后传递创建的moc,然后从第一个控制器到第五个控制器以及Answer管理对象进入第一个控制器。每当用户从一个问题移动到下一个问题时,保存在此moc中。
  2. 创建一个DataCollector类型的Singleton类,其中我有一个init方法来创建Answer实体记录和创建moc并保存到moc的方法。然后从每个问题我引用此答案管理对象并共享相同的moc。
  3. 请建议。

1 个答案:

答案 0 :(得分:0)

我能看到的最简单方法是使用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中然后清除变量中的值。