导航控制器17 Mar 2025 | 5 分钟阅读 在本教程中,我们讨论了用于在视图控制器之间导航的 segues。但是,要在两个视图控制器之间导航,segue 不是一个好的选择,因为它总是维护一个新的视图控制器,而不是仅仅弹出该视图控制器。 在本教程的这一部分中,我们将讨论更好的导航方法。 导航控制器可以定义为维护视图控制器堆栈以导航分层内容的容器视图控制器。 它是 UINavigationController 类的实例,该类继承自 UIViewController。 导航控制器管理导航界面中的一个或多个子视图控制器。 导航控制器几乎用于每个 iOS 应用程序。 即使一个或多个子视图控制器被管理到导航堆栈中,也只有一个视图控制器同时显示在屏幕上。 在视图控制器中选择一个项目会向屏幕推送一个新的视图控制器。 此过程已动画化,因此隐藏了之前的视图控制器。 让我们看一下 iOS 上设置应用程序中使用的导航界面。  嵌入在导航控制器中的所有视图控制器都包含一个导航栏,其中包含视图控制器的标题和后退按钮。 通过点击后退按钮,从导航堆栈中删除顶部视图控制器。 但是,不为堆栈的根视图提供后退按钮。 导航控制器以有序数组的形式管理视图控制器,其中第一个项目被视为根视图控制器,也是导航堆栈的底部。 数组中的最后一个项目是当前正在显示的顶部视图控制器。 我们可以使用 UINavigationController 类的方法将视图控制器推入或弹出堆栈。 导航控制器还管理导航堆栈中所有视图控制器的导航栏,该导航栏始终显示在屏幕顶部。 导航控制器还在屏幕底部管理一个可选的工具栏。 委托对象维护导航控制器的行为。 它可以提供自定义动画以推入和弹出视图控制器。 还可以指定导航界面的首选方向。 下图显示了导航控制器管理的各个对象。  导航控制器采用导航堆栈中顶部视图控制器的视图。 我们可以使用导航控制器的 view 属性来访问此视图。 但是,视图包含导航栏、内容视图和可选工具栏。 导航栏和工具栏的内容会发生变化,而视图不会发生变化。 导航控制器的属性序号 | 属性 | 描述 |
---|
1 | var delegate: UINavigationControllerDelegate? | 它表示导航控制器的委托对象。 | 2 | 协议 UINavigationControllerDelegate | 视图控制器在使用委托对象修改行为时,必须符合此协议,该行为是指从导航堆栈中推入或弹出视图控制器。 | 3 | var topViewController: UIViewController? | 它表示导航堆栈中最顶部的视图控制器。 | 4 | var visibleViewController: UIViewController? | 它表示与导航堆栈当前可见视图相关联的视图控制器。 | 5 | var viewControllers: [UIViewController] | 它表示属于导航堆栈的 UIViewController 数组。 | 6 | var interactivePopGestureRecognizer: UIGestureRecognizer? | 它是用于从导航堆栈中删除顶部视图控制器的手势识别器。 | 7 | var navigationBar: UINavigationBar | 它表示与导航控制器关联的导航栏。 | 8 | var toolbar: UIToolbar! | 它表示与导航控制器关联的 ToolBar 对象。 | 9 | var isToolbarHidden: Bool | 这是一个布尔值,指示工具栏是否与导航控制器隐藏。 | 10 | var hidesBarsOnTap: Bool | 它表示一个布尔值,指示导航控制器是否允许使用点击手势隐藏其栏。 | 11 | var hidesBarsOnSwipe: Bool | 它表示一个布尔值,指示导航栏是否响应滑动手势隐藏其栏。 | 12 | var hidesBarsWhenVerticallyCompact: Bool | 它表示一个布尔值,指示导航控制器是否在垂直紧凑的环境中隐藏其栏。 | 13 | var hidesBarsWhenKeyboardAppears: Bool | 它表示一个布尔值,指示键盘出现时导航控制器是否隐藏其栏。 | 14 | var isNavigationBarHidden: Bool | 它表示一个布尔值,指示导航栏是否隐藏。 | 15 | var barHideOnTapGestureRecognizer: UITapGestureRecognizer | 它表示用于隐藏和显示导航和工具栏的手势识别器。 | 16 | var barHideOnSwipeGestureRecognizer: UIPanGestureRecognizer | 它表示用于隐藏导航栏和工具栏的手势识别器。 |
导航控制器方法序号 | 方法 | 描述 |
---|
1 | init(rootViewController: UIViewController) | 它返回一个新创建的导航控制器,其中包含指定的根视图控制器。 | 2 | init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) | 它初始化并返回一个新创建的导航控制器,该导航控制器具有指定的导航栏类。 | 5 | func setViewControllers([UIViewController], animated: Bool) | 它用于替换当前由导航堆栈管理的视图控制器。 | 6 | func pushViewController(UIViewController, animated: Bool) | 此方法用于将指定的视图控制器推送到接收者的堆栈上并更新显示。 | 7 | func popViewController(animated: Bool) -> UIViewController? | 它返回从导航控制器弹出的视图控制器。 当用户点击导航栏中的后退按钮时,将自动触发此方法。 | 8 | func popToRootViewController(animated: Bool) -> [UIViewController]? | 它弹出堆栈上的所有视图控制器,除了根视图控制器,然后更新显示。 | 9 | func popToViewController(UIViewController, animated: Bool) -> [UIViewController]? | 此方法用于弹出导航堆栈中指定的视图控制器。 | 10 | func setNavigationBarHidden(Bool, animated: Bool) | 此方法用于隐藏与导航控制器关联的导航栏。 | 11 | func setToolbarHidden(Bool, animated: Bool) | 此方法用于隐藏与导航控制器关联的工具栏。 | 12 | func show(UIViewController, sender: Any?) | 此方法用于显示指定的视图控制器。 |
示例在此示例中,我们将看到如何将视图控制器嵌入到导航控制器中,以及如何将视图控制器推送到导航堆栈上。 界面生成器 我们将在创建新项目时看到下图所示的初始视图控制器。  要将此视图控制器嵌入到导航堆栈中,请转到编辑器 -> 嵌入并选择导航控制器,如下图所示。  这将创建一个在顶部有一个导航栏的导航控制器。 在这里,我们必须注意到导航控制器是初始视图控制器。  在这里,我们为视图控制器定义导航栏标题,让我们在应用程序中添加另一个视图控制器,以便我们可以将该视图控制器推送到导航堆栈中。 为此 ViewController 定义一个 storyboard id 为 SecondVC。  在这里,我们添加了一个按钮 (显示),通过点击该按钮,将推送第二个视图控制器。  ViewController.swift 输出 
|