从一个VC切换到另一个VC时,在视图控制器中保留数据

时间:2017-03-05 15:01:52

标签: ios swift uiviewcontroller segue

我有三个视图,每个视图都有自己的视图控制器:VC1,VC2,VC3。 用户将频繁地在三个视图中的每一个之间来回切换,包括前向和后向。 每个视图都包含数据:从前一个视图共享的数据和该视图唯一的数据。 当用户返回他已访问过的视图时,需要保留该视图上显示的数据(与他上次访问该视图时看到的数据相同),并且第一次未设置为默认值他参观了这个观点。

在第一个视图控制器VC1中,我正在准备segue将数据从VC1推送到VC​​2或VC3:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueToVC2” {
        let destinationViewController: VC2 = segue.destination as! VC2;
    destinationViewController.passedData1 = firstAmount
    destinationViewController.passedData2 = secondAmount
    destinationViewController.passedData3 = thirdAmount

    } else {
        let destinationViewController: VC3 = segue.destination as! VC3;
    destinationViewController.passedData1 = firstAmount
    destinationViewController.passedData2 = secondAmount
    destinationViewController.passedData3 = thirdAmount
    destinationViewController.passedData4 = fourthAmount
  }

点击每个视图上的GO BACK按钮,我将返回上一个视图:

@IBAction func goBackButtonPressed(_ sender: Any) {
    print("Back Button Pressed!")
    self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
}

我无法向后传递数据。当我从VC1返回到VC2时,数据已经重置为0.我没有从VC2回到VC1或从VC3回到VC2的segue。这是最简单的传递数据的方法:在Main.storyboard中创建另一个从VC2到VC1的segue,然后在我准备检查​​VC1的segue中添加另一个'if'吗?

我在视图控制器之间来回传递所有这些变量,但只在每个视图控制器中使用其中一些变量。这似乎是一种浪费,我不认为我在这里走在正确的轨道上。

任何帮助或建议?

2 个答案:

答案 0 :(得分:2)

视图控制器永远不应存储数据。他们负责协调模型对象和视图对象。这是他们的全部观点。您正在寻找的模式称为MVC(模型 - 视图 - 控制器),它是iOS开发的核心部分。

将数据移出视图控制器并将其放入模型类中。每个视图控制器都应从模型中获取数据,并将更新发送到模型中。视图控制器之间唯一应该传递的是要处理的模型对象,大多数时候只需要在一个方向上传递(在堆栈中)。

代表团在这里可以成为一个有用的工具,你也可以调查"展开segues"它们旨在帮助您向上游发送数据。但同样,您应该发送的数据主要是对模型的引用,模型本身需要存在于视图控制器之外。

它在Objective-C中,但仍然是Apple在MVC设计上最好的简单示例之一TheElements,值得探索作为基础。即使不阅读Objective-C,您也可以看到各个部分如何组合在一起。

我没有和TheElements一样研究它,但是Lister声称使用现代iOS技术很好地展示了Swift中的MVC模式。

答案 1 :(得分:0)

当您按下后退按钮时,为什么不调用将数据传递给视图控制器的委托。

或者,如果所有视图控制器共享的数据反映相同的值。创建一个单例类并在整个应用程序中使用这些值。

示例单例类:

class SomeModel {
   static let shared = SomeModel()
   private init() {}
}