在视图控制器之间传递数据的巧妙方法(第1/2部分)
在视图控制器之间有几种传递数据的方法。 在本系列的第1部分中,我们将重点放在让我们的First View Controller将其数据传递给Second View Controller上。
主要有三种方法可以实现此目的:
- 仅故事板
- 故事板与编码的混合
- 仅以编程方式
仅故事板方法
可以说,最简单的数据传递方式是通过情节提要。 首先,按住control
键,单击UI控件(在本例中为UIButton),然后拖动到Second View Controller。 弹出菜单将显示不同类型的过渡。 选择“显示”。
这将设置从UI控件到Second View Controller的顺序。 现在,只要用户与我们的按钮进行交互,您的应用程序就会自动转换为显示Second View Controller。
不要忘记给我们的segue一个标识符,以便我们可以在代码中引用它。 我们将其称为showSecondViewController
。 通常,您的第一个单词应该是动词,以帮助描述单词的完成情况。
现在,我们将跳入First View Controller并编写以下代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showSecondViewController" {
guard let secondViewController = segue.destination as? SecondViewController else { return }
// Pass Data to Second View Controller
secondViewController.dataStorageVariable = dataToPass
}
}
这就是全部!
混合方式
虽然先前的方法可行,但有时您希望控制何时开始过渡。 在这些情况下,混合方法可以节省生命。
首先,通过单击视图控制器图标而不是UIControl的control
来设置序列。 这是在情节提要中的“ First View Controller”顶部找到的黄色圆圈。
与之前一样,您还设置了segue的标识符,以便以后可以在prepare(for: segue)
传递数据
剩下的就是调用performSegue(withIdentifier: “showSecondViewController”, sender: self)
。 这将在您选择的时间开始segue,并且数据将像以前一样传递到prepare(for segue)
。
程序化方法
重要的是要了解当我们从一个View Controller过渡到下一个View Controller时,情节提要脚本正在为我们做什么 。 这样,我们将知道我们必须在代码中复制的内容。 事实证明这并不复杂:
- 实例化目标视图控制器
- 展示新的View Controller
// Instantiate Second View Controller
if let secondViewController = storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? SecondViewController {
// Pass Data
secondViewController.dataStorageVariable = dataToPass
// Present Second View
present(secondViewController, animated: true, completion: nil)
}
最后一件事:我们需要为Second View Controller添加一个Storyboard ID 。 这将是调用storyboard.instantiateViewController(withIdentifier:)
时使用的标识符。
运行代码,您应该一切顺利!
结论
总结起来,三种数据传递方式是:
- 故事板: Segue自动处理View Controller过渡。
在prepare(for: segue)
函数中重写并传递数据。 - 混合:仅当您调用
performSegue(withIdentifier: sender:)
时,Segue才会转换。
在prepare(for: segue)
传递的数据。 - 以编程方式:在情节提要中未创建segue。
调用storyboard?.instantiateViewController(withIdentifier:)
创建Second View Controller的实例。
当您准备过渡到Second View Controller时,请手动传递数据并调用present(viewControllerToPresent: animated: completion:)
。
恭喜你! 作为程序员,了解多种方式来完成一项任务以及在任何给定场景中使用最佳方法都是一件好事。 在第2部分中,我们将专注于将数据传递回 First View Controller。 睁大眼睛!