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

Posted

技术标签:

【中文标题】从一个 VC 切换到另一个 VC 时在视图控制器中保留数据【英文标题】:Retaining Data in a View Controller When Switching from One VC to Another 【发布时间】:2017-03-05 15:01:51 【问题描述】:

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

在第一个视图控制器 VC1 中,我使用 prepare for segue 将数据从 VC1 推送到 VC2 或 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
  

通过点击每个视图上的返回按钮,我返回到上一个视图:

@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 的转折。这会是最干净的数据传回方式吗:在 Main.storyboard 中创建另一个从 VC2 到 VC1 的 segue,然后在我准备检查​​ VC1 的 segue 中添加另一个“if”?

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

有什么帮助或建议吗?

【问题讨论】:

看看代表! 【参考方案1】:

视图控制器不应该存储数据。它们负责模型对象和视图对象之间的协调。这就是他们的全部意义所在。您正在寻找的模式称为 MVC (Model-View-Controller),它是 ios 开发的核​​心部分。

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

委托在这里可能是一个有用的工具,您还可以研究旨在帮助您向上游发送数据的“展开转场”。但同样,您应该发送的数据主要是对模型的引用,而模型本身需要存在于视图控制器之外。

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

我没有像 TheElements 那样研究它,但 Lister 声称是使用现代 iOS 技术在 Swift 中很好地演示 MVC 模式。

【讨论】:

【参考方案2】:

当你按下返回按钮时,为什么不调用一个将数据传递给视图控制器的委托。

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

单例类示例:

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

【讨论】:

我不确定“static let shared = SomeModel() private init() ”如何保存我的所有数据。它只会保存一条数据,例如passedData1。但我会试一试。

以上是关于从一个 VC 切换到另一个 VC 时在视图控制器中保留数据的主要内容,如果未能解决你的问题,请参考以下文章

从另一个导航控制器弹出视图控制器到另一个视图控制器

Segue 图像到另一个视图控制器的问题

在视图控制器之间切换时保留按钮状态

我如何使用推送方法(无 segue)将数据从一个 vc 传递到另一个 vc - 已关闭

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

在 Splitview 中从一个 Detail View 控制器导航到另一个 Detail VC