UINavigationController i TabBarController programowo (bez scenorysów)


Obecnie mój plik AppDelegate zawiera ten kod, aby ustawić CustomTabBarController jako rootViewController:
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
window?.rootViewController = CustomTabBarController()

Chcę, aby moja aplikacja zawsze miała na dole CustomTabBarController, ale chcę mieć kontroler nawigacji na każdej karcie. Oto kod, którego użyłem do skonfigurowania mojego tabBarController:
class CustomTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let vc1 = FirstViewController()
let vc2 = SecondViewController()
let vc3 = ThirdViewController()
viewControllers = [vc1, vc2, vc3]
}

Oto kod, którego użyłem do skonfigurowania mojego FirstViewController:
class ProfileViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 2
}func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: VCCellId, for: indexPath) as! firstVCCell return cell
}
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Łącząc
UITabBarController
i
UINavigationController
s, prawidłowym sposobem konfiguracji jest wykonanie
UITabBarController
rootViewController
. Każda karta w twoim
UITabBarController
otrzymuje swój własny
UINavigationController
. Więc jeśli masz 4 zakładki, utworzysz 4
UINavigationControllers
.
Patrz sekcja:

dodanie kontrolera nawigacji do interfejsu paska kart
https://developer.apple.com/li ... .html

Aktualizacja

Na podstawie kodu dodanego do zaktualizowanego pytania utwórz
UINavigationController
dla każdego z
vc1
,
vc2
i
vc3
.
class CustomTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let vc1 = UINavigationController(rootViewController: FirstViewController())
let vc2 = UINavigationController(rootViewController: SecondViewController())
let vc3 = UINavigationController(rootViewController: ThirdViewController()) viewControllers = [vc1, vc2, vc3]
}}

W każdym ze swoich
ViewController
s ustaw
title
na tytuł, który ma być wyświetlany na pasku nawigacyjnym po wybraniu tej karty:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
title = "First"
self.navigationController?.navigationBar.titleTextAttributes =
[NSFontAttributeName: UIFont(name: "Chalkduster", size: 27)!,
NSForegroundColorAttributeName: UIColor.black]
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zauważyłem w komentarzach do zaakceptowanej odpowiedzi, że zastanawiasz się, gdzie zmienić atrybuty paska nawigacyjnego. Jeśli planujesz zastosować to samo ustawienie na każdej karcie, możesz użyć następującego kodu w swoim CustomTabBarController:
class CustomTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()// Tab Bar Customisation
tabBar.barTintColor = .systemPink
tabBar.tintColor = .systemTeal
tabBar.unselectedItemTintColor = .systemGray
tabBar.isTranslucent = false viewControllers = [
createTabBarItem(tabBarTitle: "Tab 1", tabBarImage: "TabBarImg1", viewController: ViewControllerOne()),
createTabBarItem(tabBarTitle: "Tab 2", tabBarImage: "TabBarImg2", viewController: ViewControllerTwo()),
createTabBarItem(tabBarTitle: "Tab 3", tabBarImage: "TabBarImg3", viewController: ViewControllerThree()),
createTabBarItem(tabBarTitle: "Tab 4", tabBarImage: "TabBarImg4", viewController: ViewControllerFour())
]
} func createTabBarItem(tabBarTitle: String, tabBarImage: String, viewController: UIViewController) -> UINavigationController {
let navCont = UINavigationController(rootViewController: viewController)
navCont.tabBarItem.title = tabBarTitle
navCont.tabBarItem.image = UIImage(named: tabBarImage)// Nav Bar Customisation
navCont.navigationBar.barTintColor = .systemRed
navCont.navigationBar.tintColor = .systemBlue
navCont.navigationBar.isTranslucent = false
return navCont
}
}

Osobiście podoba mi się to podejście, ponieważ oszczędza mi kłopotów z powtarzaniem kodu w kontrolerach ViewControllers i zachowuje kartę kodu kreskowego nawigacji & amp; zorganizowane w niestandardowych klasach z paskiem kart.
Jeśli nie chcesz używać tej samej karty dostosowywania lub paska nawigacyjnego w całej aplikacji, możesz po prostu dostosować każdą z nich indywidualnie, jak chcesz, w odpowiedniej klasie ViewControllers. Jeśli jednak każda zakładka będzie miała inne atrybuty tab i/lub nawigacji, odpowiedź Vacawamy będzie najprawdopodobniej najlepszym podejściem!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz spróbować tego:
viewControllers = [vc1, vc2, vc3].map{UINavigationController(rootViewController: $0)}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się