【问题标题】:Retaining Data in a View Controller When Switching from One VC to Another从一个 VC 切换到另一个 VC 时在视图控制器中保留数据
【发布时间】: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”?

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

有什么帮助或建议吗?

【问题讨论】:

  • 看看代表!

标签: ios swift uiviewcontroller segue


【解决方案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。但我会试一试。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2020-06-11
    • 2021-12-31
    相关资源
    最近更新 更多