using TabBarController in MVVM-C, coordinator for Tab Bar

1.8k Views Asked by At

I am using MVVM with coordinator pattern for navigation. Navigation is made with pushViewController. Tab Bar Controller is created in TabBarCoordinator class.

class TabBarCoordinator: NSObject, BaseCoordinator {
        
        
        var rootViewController: UIViewController {
            return tabBarController
        }
    
        var tabBarController: UITabBarController
        
        var window: UIWindow
        private let appDependency: AppDependency
        var navigationController: NavigationController
        private let navigationObserver: NavigationObserver
        
        var childCoordinators: [BaseCoordinator] = []
        
        var onDidFinish: (() -> Void)?
        
        var topController: UIViewController {
          if let lastChild = topCoordinator {
            return lastChild.topController
          }
          var controller: UIViewController = navigationController
          while let presentedController = controller.presentedViewController {
            controller = presentedController
          }
          return controller
        }
        
        func start() {
            
            let homeCoordinator = HomeCoordinator(navigationObserver: navigationObserver,
                                              navigationController: navigationController,
                                              appDependency: appDependency)
            add(child: homeCoordinator)
            homeCoordinator.start()
            
            let ordersListCoordinator = OrdersListCoordinator(navigationController: navigationController,
                                                           navigationObserver: navigationObserver,
                                                           appDependency: appDependency,
                                                           filterStatus: nil)
            add(child: ordersListCoordinator)
            ordersListCoordinator.start()
            
            tabBarController.navigationController?.navigationBar.isTranslucent = true
            
            let homeVC = homeCoordinator.topController
            homeVC.tabBarItem = UITabBarItem(title: "home", image: nil, selectedImage: nil)
            
            let ordersListVC = ordersListCoordinator.topController
            ordersListVC.tabBarItem = UITabBarItem(title: "orders", image: nil, selectedImage: nil)
            
            let controllers = [homeVC, ordersListVC]
            
            tabBarController.viewControllers = controllers.map { UINavigationController(rootViewController: $0) }
            
            window.rootViewController = tabBarController
            window.makeKeyAndVisible()
            
        }
        
        required init(window: UIWindow,
            navigationObserver: NavigationObserver,
             navigationController: NavigationController,
             appDependency: AppDependency
        ) {
            
            tabBarController = UITabBarController()
            self.window = window
          self.navigationController = navigationController
          self.navigationObserver = navigationObserver
          self.appDependency = appDependency
        }
    }

Here the code of func start() for HomeCoordinator class:

func start() {
        guard let user = appDependency.userDataStore.authorizedUserInfo?.user else { return }
        let viewModel = HomeViewModel(user: user)
        viewModel.delegate = self
        let homeViewController = HomeViewController(viewModel: viewModel)
        viewController = homeViewController
        navigationController.viewControllers = [homeViewController]
    }

Tab bar Screenshot

Problems with tab bar:

  • isTranslucent doesn't hide navBar from TabbarController
  • the screen is black
  • views of tabBarItems are not shown, but you can still tap them and screens would change
  • the second vc is just black screen

Any ideas what's wrong with my TabBarCoordinator class? Thank you in advance

0

There are 0 best solutions below