在学习swift过程中 要求我不用课程里的nav+tabbar结构,而是采用tabbar➕nav
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let vc = MainController()
self.window = UIWindow(frame: UIScreen.main.bounds)
window!.rootViewController = vc
window!.makeKeyAndVisible()
return true
}
}
这里面的MainController里面一定得是tabbar
MainController:
class MainController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
tabBar.tintColor = .primaryColor
tabBar.isTranslucent = true
addChildController(DiscoveryController(), "发现", "Discovery")
addChildController(FeedbackController(), "动态", "Feed")
addChildController(CartController(), "购物车", "Live")
addChildController(OrderController(), "订单", "Live")
}
func addChildController(_ vc:UIViewController, _ title:String, _ imageName:String){
let target = UINavigationController(rootViewController: vc)
target.tabBarItem.title = title
target.tabBarItem.image = UIImage(named: imageName)
target.tabBarItem.selectedImage = UIImage(named: "\(imageName)Selected")
target.tabBarItem.setBadgeTextAttributes([.foregroundColor:UIColor.colorOnSurface], for: .selected)
addChild(target)
}
}
func addChildController里面 要把每个viewcontroller套个nav 所以用
let target = UINavigationController(rootViewController: vc)
两者区别是:
T+N:
Tab Bar Controller:通常用于应用的主要导航层次结构,每个选项卡代表应用中的一个独立的模块或视图控制器。
Navigation Controller:可以嵌套在每个选项卡中的某些视图中,提供了从一个视图到另一个视图的导航功能,包括推入和弹出视图控制器。每个导航控制器都可以有自己独立的导航堆栈。
在这种结构下,每个选项卡可以有自己的导航控制器。用户可以通过切换选项卡来访问不同的模块或视图,并且在每个模块内部,可以使用导航控制器来管理其内部的视图导航。
N+T:
Navigation Controller:是应用的主要导航层次结构,用于管理应用中的多个视图控制器。它提供了导航栈的管理,用户可以通过推入和弹出视图控制器来浏览不同的界面。
Tab Bar Controller:通常嵌套在导航控制器内部的某些视图中。每个选项卡代表一个视图控制器,用户可以通过点击选项卡来切换不同的模块或视图。
在这种结构下,导航控制器是应用的主要导航方式,用户可以在应用的不同层级之间导航。某些特定的视图或模块可能包含一个选项卡控制器,允许用户在该视图内部切换不同的功能。
应用场景:
如果你的应用有多个独立的模块需要切换,你可能会选择第一种结构。如果你的应用有一个主要的导航结构,但某些部分需要包含多个子模块,你可能会选择第二种结构。