Skip to content

wklhtcone/TabandNav

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

1. UITabBarController与UINavigationController

1.1 区别

  • UINavigationController以栈的形式保存视图控制器,使用push将视图控制器入栈、pop移除栈顶控制器,pop后视图控制器对象会被释放
  • UITabBarController用于不同视图控制器间的切换,切换视图时视图控制器不会被销毁,通常作为整个程序的rootViewController
  • 下面是苹果推荐的方式 在这里插入图片描述

1.2 为何嵌套使用

  • 将导航控制器嵌套在UITabBarController中,能够在不同的标签项里实现不同的层次结构
  • 如下图中Tab Bar Controller关联着3个导航控制器,不同导航控制器下管理着不同数量的View Controller 在这里插入图片描述

2. Demo

  • 点击登录Button显示Tab Bar Controller,可以三个Tab Bar之间页面切换 在这里插入图片描述

在这里插入图片描述

  1. 创建3个视图控制器类,并分别设为3个导航控制器的根视图
//title是导航控制器的标题
class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemIndigo
        title = "主页"
    }
}

class SecondViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemOrange
        title = "联系人"
    }
}

class ThirdViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBlue
        title = "帮助"
    }
}

//title是Tab Bar标签上的文字
let vc1 = UINavigationController(rootViewController: FirstViewController())
let vc2 = UINavigationController(rootViewController: SecondViewController())
let vc3 = UINavigationController(rootViewController: ThirdViewController())

vc1.title = "主页"
vc2.title = "联系人"
vc3.title = "帮助"
  1. 创建Tab Bar Controller并设置要显示的视图控制器数组,数组中顺序即显示的顺序
let tabBarVC = UITabBarController()
tabBarVC.setViewControllers([vc1, vc2, vc3], animated: false)

在这里插入图片描述

  1. 设置每个Tab Bar的图标
let items = tabBarVC.tabBar.items
let imgList = ["house", "person.circle", "gear"]
for index in 0..<imgList.count {
    items[index].image = UIImage(systemName: imgList[index])
}
  1. 以上逻辑发生在点击登录button后
  • 创建及设置button
let button: UIButton = {
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
    button.setTitle("登录", for: .normal)
    button.backgroundColor = .white
    button.setTitleColor(.black, for: .normal)
    return button
}()
  • 将button加入视图并设置点击后触发的方法
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .systemBlue
    view.addSubview(button)
    button.center = view.center
    button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
}
  • 实现didTapButton方法
@objc func didTapButton(){
    let tabBarVC = UITabBarController()

    let vc1 = UINavigationController(rootViewController: FirstViewController())
    let vc2 = UINavigationController(rootViewController: SecondViewController())
    let vc3 = UINavigationController(rootViewController: ThirdViewController())

    vc1.title = "主页"
    vc2.title = "联系人"
    vc3.title = "帮助"

    tabBarVC.setViewControllers([vc1, vc2, vc3], animated: false)

    guard let items = tabBarVC.tabBar.items else{
        return
    }

    let imgList = ["house", "person.circle", "gear"]

    for index in 0..<imgList.count {
        items[index].image = UIImage(systemName: imgList[index])
    }

    tabBarVC.modalPresentationStyle = .fullScreen
    present(tabBarVC, animated: true)
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages