View Controller 之间的切换

View Controller 之间的切换主要有三种方式:

  • Storyboard 的 segue。如果使用 Storyboard 来构建 App,那么只需要 Ctrl-Drag 即可实现 View Controller 的切换,比如将一个按钮 Ctrl-Drag 到另一个 View Controller 上。如果一个 segue 链接的是两个 View Controller,那么就需要用代码来完成跳转,这个时候需要为 segue 来指定一个 Identifier,通过调用performSegueWithIdentifier:sender:来完成跳转。
  • pushViewController:animated:方法。这个方法需要当前的 View Controller 在一个 UINavigationController 内部。UINavigationController 内部维护了一个栈来保存其中的所有 View Controller,将新的 View Controller push 到栈内就可以完成跳转。
  • presentViewController:animated:completion:方法。不同于上一种方法,这个方法并不是将 View Controller push 到栈内,而是维护一个 presenting 和 presented 关系。例如有两个 View Controller 分别叫 A 和 B,如果 A 调用此方法来显示 B,相当于 A 拥有 了 B。A 中的presentedViewController属性会指向 B,B 的presentingViewController属性会指向 A,这个关系是由系统自动维护的。

其中的第二种方法和第三种方法是类似的。他们之间的区别更多的是语义上的区别——presentViewController:animated:completion:方法更多的是在强调打断现有的工作流,展现一组新的 View 来完成某个特定的工作,通常需要向用户获取某些信息[^1]。它常常用来显示一个模态的 View,一个模态的 View 通常有下面三个特点[^2]:

  • 占据整个屏幕,或者 iPad 上的整个 父View 的区域。
  • 包含了完成一个任务所需的文本和控件。
  • 通常有一个完成按钮和一个取消按钮,点击它们来表示任务的完成情况,并且退出当前的 View。

典型的场景:用户登录、添加一项待办事项。

另外一个值得注意的地方是,在写 App 的时候有必要了解在各个状态下,栈中的 View Controller 都有哪些,以避免重复地 push 同一个 View Controller。并且可以利用 UINavigationController 提供的一系列 pop*ViewController 的方法来快速到达指定的 View Controller。

给鸡排饭加个蛋