swift:UITabBarController和UINavigationController混合使用

在我们的项目中,除非是只有一个控制器的App,否则,通常需要对这些控制器进行管理。为了方便对这些控制器进行管理,iOS提供了2种特殊的控制器:1.UITabBarController 2.UINavigationController.关于这两个特殊控制器的一般用法,可以查看这篇文章:iOS多控制器之UINavigationController&UITableBarController - 简书
我们将要介绍的是如何同时使用这两种特殊控制器,我们先看看同时使用这两个控制器时候它们之间的关系:

image

可以看到TabbarView位于UIWindow之上,而NavigationView位于TabbarView之上,最后我们的主要视图在最上方。这里的关系我们在SceneDelegate.swift里进行设置,而在此之前我们要在targets中将Main Interface设置为空,不使用默认的故事板,否则会出现黑屏:

image

设置完后开始在SceneDelegate.swift编写代码:

    guard let _ = (scene as? UIWindowScene) else { return }
    self.window = UIWindow(windowScene: scene as! UIWindowScene)
    
    let tab = UITabBarController.init()
    
    let  uikitVC = UIStoryboard.init(name: "uiKit", bundle: nil).instantiateViewController(identifier: "uiVC")
    let uiNav = UINavigationController(rootViewController: uikitVC)
    uiNav.title = "uiKit"
    
    let arVC = UIStoryboard.init(name: "AR", bundle: nil).instantiateViewController(identifier: "ARVC")
    let arN = UINavigationController(rootViewController: arVC)
    arN.title =  "AR"
    
    tab.viewControllers = [uiNav, arN]
    self.window?.rootViewController = tab

    self.window?.makeKeyAndVisible()

当我们要在navigation所属控制器内部进行页面跳转时,我们使用push的方法进行压栈,同时若我们想在push后的VC中底部的tabbaritem隐藏时,我们还要进行相应的设置:

        let photoVC = UIStoryboard.init(name: "uiKit", bundle: nil).instantiateViewController(identifier: "photoVC")
        photoVC.hidesBottomBarWhenPushed = true// navigation push到另一个视图时候底部tabbaritem不显示
        self.navigationController?.pushViewController(photoVC, animated: true)

至此就基本完成两种控制器的混合编程了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。