导航控制器

17 Mar 2025 | 5 分钟阅读

在本教程中,我们讨论了用于在视图控制器之间导航的 segues。但是,要在两个视图控制器之间导航,segue 不是一个好的选择,因为它总是维护一个新的视图控制器,而不是仅仅弹出该视图控制器。

在本教程的这一部分中,我们将讨论更好的导航方法。 导航控制器可以定义为维护视图控制器堆栈以导航分层内容的容器视图控制器。 它是 UINavigationController 类的实例,该类继承自 UIViewController。

导航控制器管理导航界面中的一个或多个子视图控制器。 导航控制器几乎用于每个 iOS 应用程序。 即使一个或多个子视图控制器被管理到导航堆栈中,也只有一个视图控制器同时显示在屏幕上。 在视图控制器中选择一个项目会向屏幕推送一个新的视图控制器。 此过程已动画化,因此隐藏了之前的视图控制器。 让我们看一下 iOS 上设置应用程序中使用的导航界面。

Navigation Controller Navigation Controller

嵌入在导航控制器中的所有视图控制器都包含一个导航栏,其中包含视图控制器的标题和后退按钮。 通过点击后退按钮,从导航堆栈中删除顶部视图控制器。 但是,不为堆栈的根视图提供后退按钮。

导航控制器以有序数组的形式管理视图控制器,其中第一个项目被视为根视图控制器,也是导航堆栈的底部。 数组中的最后一个项目是当前正在显示的顶部视图控制器。 我们可以使用 UINavigationController 类的方法将视图控制器推入或弹出堆栈。

导航控制器还管理导航堆栈中所有视图控制器的导航栏,该导航栏始终显示在屏幕顶部。 导航控制器还在屏幕底部管理一个可选的工具栏。

委托对象维护导航控制器的行为。 它可以提供自定义动画以推入和弹出视图控制器。 还可以指定导航界面的首选方向。

下图显示了导航控制器管理的各个对象。

Navigation Controller

导航控制器采用导航堆栈中顶部视图控制器的视图。 我们可以使用导航控制器的 view 属性来访问此视图。 但是,视图包含导航栏、内容视图和可选工具栏。 导航栏和工具栏的内容会发生变化,而视图不会发生变化。

导航控制器的属性

序号属性描述
1var delegate: UINavigationControllerDelegate?它表示导航控制器的委托对象。
2协议 UINavigationControllerDelegate视图控制器在使用委托对象修改行为时,必须符合此协议,该行为是指从导航堆栈中推入或弹出视图控制器。
3var topViewController: UIViewController?它表示导航堆栈中最顶部的视图控制器。
4var visibleViewController: UIViewController?它表示与导航堆栈当前可见视图相关联的视图控制器。
5var viewControllers: [UIViewController]它表示属于导航堆栈的 UIViewController 数组。
6var interactivePopGestureRecognizer: UIGestureRecognizer?它是用于从导航堆栈中删除顶部视图控制器的手势识别器。
7var navigationBar: UINavigationBar它表示与导航控制器关联的导航栏。
8var toolbar: UIToolbar!它表示与导航控制器关联的 ToolBar 对象。
9var isToolbarHidden: Bool这是一个布尔值,指示工具栏是否与导航控制器隐藏。
10var hidesBarsOnTap: Bool它表示一个布尔值,指示导航控制器是否允许使用点击手势隐藏其栏。
11var hidesBarsOnSwipe: Bool它表示一个布尔值,指示导航栏是否响应滑动手势隐藏其栏。
12var hidesBarsWhenVerticallyCompact: Bool它表示一个布尔值,指示导航控制器是否在垂直紧凑的环境中隐藏其栏。
13var hidesBarsWhenKeyboardAppears: Bool它表示一个布尔值,指示键盘出现时导航控制器是否隐藏其栏。
14var isNavigationBarHidden: Bool它表示一个布尔值,指示导航栏是否隐藏。
15var barHideOnTapGestureRecognizer: UITapGestureRecognizer它表示用于隐藏和显示导航和工具栏的手势识别器。
16var barHideOnSwipeGestureRecognizer: UIPanGestureRecognizer它表示用于隐藏导航栏和工具栏的手势识别器。

导航控制器方法

序号方法描述
1init(rootViewController: UIViewController)它返回一个新创建的导航控制器,其中包含指定的根视图控制器。
2init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?)它初始化并返回一个新创建的导航控制器,该导航控制器具有指定的导航栏类。
5func setViewControllers([UIViewController], animated: Bool)它用于替换当前由导航堆栈管理的视图控制器。
6func pushViewController(UIViewController, animated: Bool)此方法用于将指定的视图控制器推送到接收者的堆栈上并更新显示。
7func popViewController(animated: Bool) -> UIViewController?它返回从导航控制器弹出的视图控制器。 当用户点击导航栏中的后退按钮时,将自动触发此方法。
8func popToRootViewController(animated: Bool) -> [UIViewController]?它弹出堆栈上的所有视图控制器,除了根视图控制器,然后更新显示。
9func popToViewController(UIViewController, animated: Bool) -> [UIViewController]?此方法用于弹出导航堆栈中指定的视图控制器。
10func setNavigationBarHidden(Bool, animated: Bool)此方法用于隐藏与导航控制器关联的导航栏。
11func setToolbarHidden(Bool, animated: Bool)此方法用于隐藏与导航控制器关联的工具栏。
12func show(UIViewController, sender: Any?)此方法用于显示指定的视图控制器。

示例

在此示例中,我们将看到如何将视图控制器嵌入到导航控制器中,以及如何将视图控制器推送到导航堆栈上。

界面生成器

我们将在创建新项目时看到下图所示的初始视图控制器。

Navigation Controller

要将此视图控制器嵌入到导航堆栈中,请转到编辑器 -> 嵌入并选择导航控制器,如下图所示。

Navigation Controller

这将创建一个在顶部有一个导航栏的导航控制器。 在这里,我们必须注意到导航控制器是初始视图控制器。

Navigation Controller

在这里,我们为视图控制器定义导航栏标题,让我们在应用程序中添加另一个视图控制器,以便我们可以将该视图控制器推送到导航堆栈中。 为此 ViewController 定义一个 storyboard id 为 SecondVC。

Navigation Controller

在这里,我们添加了一个按钮 (显示),通过点击该按钮,将推送第二个视图控制器。

Navigation Controller

ViewController.swift

输出

Navigation Controller
下一个主题导航栏