iOS Swift 4 使用 Segue

Swift 4 让在各个 ViewController 中进行切换更为方便,即通过 Segue。只要在 Storyboard 中摁住 Ctrl 用鼠标拖动即可设置好 Segue。

此外,开发时常常会遇到在多个 ViewController 之间传参的问题。一种粗暴的解决方案是使用全局变量,但是很不优雅。

本文介绍如何在代码中控制 Segue,并利用 Segue 传参。

在代码中控制 Segue

首先在 Storyboard 中选中特定的 Segue 路线,在右侧的属性栏中为其指定一个 Identifier(本例中为 segueToNextViewController),在代码中则可以如此进行 Segue:

self.performSegue(withIdentifier: "segueToNextViewController", sender: self)

注意:如果在后台进程中调用 performSegue,需要将其转为前台线程:

DispatchQueue.main.async {
self.performSegue(withIdentifier: "segueToNextViewController", sender: self)
}

利用 Segue 传参

背景

源 ViewController:courseViewController
目的 ViewController 1:attendanceTableViewController
目的 ViewController 2:questionTableViewController
需要传的参数:var selectedCourse: Course

首先要把参数定义在每个 ViewController 中。

准备 Segue

假设用户的某个操作可以触发源 ViewController 向目的 ViewController 的 Segue,我们要做的就是在 Segue 即将开始之前将参数传递完毕。因此需要在源 ViewController(本例为 courseViewController)中定义:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is attendanceTableViewController {
let t = segue.destination as? attendanceTableViewController
t?.selectedCourse = self.selectedCourse
}
if segue.destination is questionTableViewController {
let t = segue.destination as? questionTableViewController
t?.selectedCourse = self.selectedCourse
}
}

这段代码首先判断 Segue 的目的地是哪个 ViewController(如果目的 ViewController 只可能有一个,则不需要判断)。然后将自己的参数(self.selectedCourse)传递给目的 ViewController。

于是在 Segue 完成后,在目的 ViewController 的 viewDidLoad()viewDidAppear() 等函数中就可以使用这个参数了。