UINavigationController 导航控制器

192 阅读2分钟

之前有一次设置了self.window.rootViewController = newViewController。但是没有把newViewController放入UINavigationController导航栈,结果一直跳转不了页面。浪费了很多时间。

UINavigationController导航控制器

UINavigationController,它用来管理视图控制器的层次结构,并提供导航栏(NavigationBar)来帮助用户在不同的视图控制器之间进行导航。通过这种方式,可以方便地实现页面之间的前进和后退操作。

使用UINavigationController

创建 UINavigationController

通常情况下,你会将一个视图控制器设置为根视图控制器(root view controller),然后把这个视图控制器传给 UINavigationController 的初始化方法。


       let viewController = ViewController()
        
        // 将它嵌入到导航控制器中
        let navController = UINavigationController(rootViewController: viewController)
        
        // 创建一个 UIWindow 实例,指定其 windowScene,并将导航控制器设置为其根视图控制器
        self.window = UIWindow(windowScene: windowScene)
        self.window?.rootViewController = navController
        self.window?.makeKeyAndVisible()

推送新视图控制器 页面导航

要从当前视图控制器导航到另一个视图控制器,你可以使用 pushViewController(_:animated:) 方法。

let nextViewController = NextViewController()
navigationController?.pushViewController(nextViewController, animated: true)

返回上一个视图控制器: 可以通过 popViewController(animated:) 方法返回到前一个视图控制器,或者使用 popToRootViewControllerAnimated(_:) 返回到根视图控制器。

Tab Bar Controller与Navigation Controller的2种组合方式

每个Tab包含一个Navigation Controller

这是最常见的方式,每个标签页都有自己的 UINavigationController 作为其根视图控制器。这样,每个标签都可以独立地处理自己的导航流程。

  • 创建多个 UINavigationController 实例,每个实例都包含一个不同的根视图控制器。
  • 将这些 UINavigationController 实例添加到 UITabBarController 的 viewControllers 属性中。
let tabBarController = UITabBarController()

let firstNavController = UINavigationController(rootViewController: FirstViewController())
let secondNavController = UINavigationController(rootViewController: SecondViewController())

tabBarController.viewControllers = [firstNavController, secondNavController]

单一Navigation Controller用于所有Tabs

这种方式不太常见,因为每个标签页共享同一个导航栈可能会导致用户体验不佳。不过,在某些特定场景下,这种模式也可能是合适的。

  • 在这种情况下,你首先需要创建一个 UINavigationController,然后将 UITabBarController 设置为其根视图控制器,或反之亦然,取决于具体需求。
        // 创建两个简单的View Controllers作为Tab的内容
        let vc1 = UIViewController()
        vc1.view.backgroundColor = .white
        vc1.tabBarItem.title = "首页"
        
        let vc2 = UIViewController()
        vc2.view.backgroundColor = .lightGray
        vc2.tabBarItem.title = "设置"
        
        // 创建Tab Bar Controller并添加View Controllers
        let tabBarController = UITabBarController()
        tabBarController.viewControllers = [vc1, vc2]
        
        // 创建Navigation Controller并将Tab Bar Controller设为其root view controller
        let navController = UINavigationController(rootViewController: tabBarController)
        
        // 设置window的rootViewController为Navigation Controller
        window?.rootViewController = navController
        window?.makeKeyAndVisible()