从一个 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)将数据从一个 vc 传递到另一个 vc - 已关闭