UITabBarController Programmatically

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • UITabBarController Programmatically

    Hallo zusammen,

    ich habe ein Problem mit dem UITabBarController, ich habe versucht den Controller ohne Storyboard zu erstellen. Dies gelingt mir auch, allerdings passiert mit einem Klick auf die einzelnen Items in der TabBar nichts. Sie werden zwar aktiviert (blau hinterlegt), es gelingt aber kein Absprung auf den entsprechenden neuen ViewController.
    Ich habe mich bei der Entwicklung an folgende Anleitung gehalten: medium.com/@ITZDERR/uinavigati…ally-swift-3-d85a885a5fd0

    Dies ist mein Coding für den TabBarController


    Quellcode

    1. import UIKit
    2. class TabBarController: UITabBarController{
    3. override func viewDidLoad() {
    4. super.viewDidLoad()
    5. // let tabBarController = UITabBarController()
    6. self.tabBar.backgroundColor = .white
    7. self.tabBar.frame.origin.y = view.frame.size.height - CGFloat(tabBarHeight)
    8. self.tabBar.frame.size.height = CGFloat(tabBarHeight)
    9. let homeVC = HomeViewController()
    10. homeVC.title = "Home"
    11. homeVC.tabBarItem = UITabBarItem.init(title: "Home", image: UIImage(systemName: "house.fill"), tag: 0)
    12. let tripHomeVC = TripHomeViewController()
    13. tripHomeVC.title = "Trips"
    14. tripHomeVC.tabBarItem = UITabBarItem.init(title: "Trips", image: UIImage(systemName: "globe"), tag: 1)
    15. let statsHomeVC = StatisticHomeViewController()
    16. statsHomeVC.title = "Statistics"
    17. statsHomeVC.tabBarItem = UITabBarItem.init(title: "Statistic", image: UIImage(systemName: "chart.pie.fill"), tag: 2)
    18. let settingsHomeVC = SettingsHomeViewController()
    19. settingsHomeVC.title = "Home"
    20. settingsHomeVC.tabBarItem = UITabBarItem.init(title: "Settings", image: UIImage(systemName: "gear"), tag: 3)
    21. let controllerArray = [homeVC, tripHomeVC, statsHomeVC, settingsHomeVC]
    22. // tabBarController.viewControllers = controllerArray
    23. self.viewControllers = controllerArray.map { UINavigationController(rootViewController: $0)}
    24. // view.addSubview(tabBarController.view)
    25. }
    26. }
    Alles anzeigen
    Und so füge ich den Controller dann zu meinem ViewController hinzu.

    Quellcode

    1. // Setup TabBar
    2. let tabBarController = TabBarController()
    3. self.view.addSubview(tabBarController.view)
    Habt ihr Ideen, woran es scheitern könnte?


    Danke und VG
  • Hey,

    ich glaube du suchst nach so etwas. Du musst deiner Tabbar auch sagen wohin die Reise geht nachdem ein TabBarItem angeklickt wurde. Dafür kann man diese Funktion benutzen


    Quellcode

    1. func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    2. if viewController is deinViewController {
    3. if let newVC = tabBarController.storyboard?.instantiateViewController(withIdentifier: "deine TabBar") {
    4. newVC.modalPresentationStyle = .overFullScreen
    5. tabBarController.present(newVC, animated: true)
    6. return false
    7. }
    8. }
    9. return true
    10. }
    Vielleicht ist das hier auch was für dich: Detect when a tab bar item is pressed
  • Hallo zusammen,

    erstmal danke für die Antworten und entschuldigt meine späte Antwort.

    1) Die Funktion habe ich schon ausprobiert, sie wird aber leider überhaupt nicht aufgerufen.

    2) Das macht alles soweit Sinn, aber ich verstehe diesen AddChild Prozess noch nicht wirklich, als Child kann ich ja so wie ich das verstehe nur einen ViewController mitgeben. Wenn ich jetzt also schreibe addChild(TabBarController.view) wirft das ganze einen Fehler. Kannst du mir sagen, wie ich den TabBarController als Child dazu bekomme? Denn scheinbar ist es ja wirklich so, dass die Benachrichtigungen einfach nicht weiter gereicht werden, falls ein Item geklickt wurde.

    Danke und VG
  • Wenn Du in die Doku von UITabBarController schaust, dann sieht Du ganz weit unten unter Relationships > Inherits From, dass der UITabbarController von UIViewController abgeleitet ist.

    Du kannst also einfach den UITabBarController als Parameter für addChild(_:) verwenden. ;)

    Im Beispielcode von Creating a Custom Container View Controller sollte man dies ganz gut erkennen:

    In Deinem Fall lädst Du den Child View Controller halt nicht aus einem Storyboard, sondern erzeugst in per Code.

    Quellcode

    1. // Create a child view controller and add it to the current view controller.
    2. let storyboard = UIStoryboard(name: "Main", bundle: .main)
    3. if let viewController = storyboard.instantiateViewController(identifier: "imageViewController")
    4. as? ImageViewController {
    5. // Add the view controller to the container.
    6. addChild(viewController)
    7. view.addSubview(viewController.view)
    8. // Create and activate the constraints for the child’s view.
    9. onscreenConstraints = configureConstraintsForContainedView(containedView: viewController.view,
    10. stage: .onscreen)
    11. NSLayoutConstraint.activate(onscreenConstraints)
    12. // Notify the child view controller that the move is complete.
    13. viewController.didMove(toParent: self)
    14. }
    Alles anzeigen
  • Ok, das geht tatsächlich ohne Fehler.

    Quellcode

    1. let tabBarController = TabBarController()
    2. addChild(tabBarController)
    3. view.addSubview(tabBarController.view)
    4. tabBarController.didMove(toParent: self)
    Das steht jetzt in meinem ViewController, allerdings passiert jetzt gar nichts mehr.
    Zum Verständnis, ich habe eine Login Seite vorgeschaltet und komme dann ins eigentliche Menü mit TabBar.
    Die Buttons auf der Login Seite haben allerdings nach der addChild Zeile keine Funktion mehr. Ich stehe auf dem Schlauch.

    Aber das meintest du doch auch bzgl. ViewController per Code erzeugen oder nicht? Ein Storyboard ist ja generell nicht vorhanden in meiner App.