UITarBarController 结合 UINavigationController + UIViewController

UITabBarController按照文档说明是一个ViewController的容器,UINavigationController也是一个ViewController的容器。

UITabBarController 简称: tbc
UINavigationController 简称: nc
UIViewController 简称: vc

简单的UITabBarContoller应用

tbc的作用是提供一个平级的vc容器,其提供一个tabbarItem作为vc切换的操作组,在初始化的时候,会将其包含的所有vc全部初始化。
而每个vc可以在其自身内部获取一个 tbc 的对象,去设置其对应的在tabbarItem中的文字和图片。

let tabbarVC = UITabBarController()

// 这个VC对应的文字和图标可以在自己继承的类里面设置
// self.tabbarController.tabbarItem.title = "xx"
let firstVC = UIViewController()
let secondVC = UIViewController()
let thirdVC = UIViewController()

// 将所有的vc设置到tabbarVC的容器中
// tabbar中的文字和图片在 *VC的实现中自己设置
tabbarVC.viewControllers = [firstVC, secondVC, thirdVC]

但是一般场景中,tbc是做为整个app的根节点(类似微信、闹钟)
固上面的代码可以在 AppDelegata.swfit 中进行设置

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
     self.window = UIWindow(frame: UIScreen().main.bounds)

     self.window.rootViewController = tabbarVC
}

结合UINavigationController

往往在tbc中的view都需要继续各自的流程,比如tableViewController打开其他的VC进行展示或者配置,此时就需要使用 nc 来组合设置了。
在上面的例子中,我们直接将VC丢入到 tbc 中,
现在我们更新一下,将VC套入到 nc 中,然后再设置到 tbc

let firstNC = UINavigationController()
let secondNC = UINavigationController()
let thirdNC = UINavigationController()

firstNC.viewControllers = [firstVC]
secondNC.viewControllers = [secondVC]
thirdNC.viewControllers = [thirdVC]

tabbarVC.viewControllers = [firstNC, secondNC, thirdNC]

看起来层级就是
|- UITabBarController
||-- UINavigationController
||| -- UIViewController * N

有几点要注意的是:

  1. 我在项目中最开始实现的方式,rootViewController是一个 nc,然后里面再套一个 tbc。 这样虽然出现了导航栏,但是在进行后续的跳转的时候会出现很多问题,很多莫名其妙的问题
  2. 每个 nc 里面的 vc 要设置好自己的 navigationItem内容,不然会被覆盖的,因为他们公用一个 navigationItem

你可能感兴趣的:(UITarBarController 结合 UINavigationController + UIViewController)