繁体   English   中英

如何将协调器模式应用于 tabBar?

[英]How do I apply the coordinator pattern to the tabBar?

我想将协调器模式应用于标签栏。

首先,我的AppCoordinator


class AppCoordinator: Coordinator {
   let window: UIWindow?
   var navigationController: UINavigationController
   var childCoordinator: [Coordinator] = []
   var parentCoordinator: Coordinator?
    
    init(_ window: UIWindow?, navigationController: UINavigationController) {
        self.window = window
        self.navigationController = navigationController
        window?.makeKeyAndVisible()
    }
    
    func start() {
        var tabBarController = setTabBarController()
        self.window?.rootViewController = tabBarController
    }
    
    func setTabBarController() -> UITabBarController {
        let tabBar = UITabBarController()
        
        let firstItem = UITabBarItem(title: nil, image: Image.mainImg, tag: 0)
        let secondItem = UITabBarItem(title: nil, image: Image.searchImg, tag: 1)
        let thirdItem = UITabBarItem(title: nil, image: Image.likePostImg, tag: 2)
        let fourItem = UITabBarItem(title: nil, image: Image.profileImg, tag: 3)
        
        
        let firstCoordinator = MainCoordinator(navigationController: navigationController)
        firstCoordinator.parentCoordinator = self
        childCoordinator.append(firstCoordinator)
        let firstVC = firstCoordinator.startPush()
        firstVC.tabBarItem = firstItem
        
        let secondCoordinator = SearchCoordinator(navigationController: navigationController)
        secondCoordinator.parentCoordinator = self
        childCoordinator.append(secondCoordinator)
        let secondVC = secondCoordinator.startPush()
        secondVC.tabBarItem = secondItem
        
        let thirdCoordinator = LikePostCoordinator(navigationController: navigationController)
        thirdCoordinator.parentCoordinator = self
        childCoordinator.append(thirdCoordinator)
        let thirdVC = thirdCoordinator.startPush()
        thirdVC.tabBarItem = thirdItem
        
        tabBar.viewControllers = [firstVC, secondVC, thirdVC]
        
        return tabBar
    }
}


和我的MainCoordinator


class MainCoordinator: baseCoordinator {

    func startPush() -> UINavigationController {
        
        let MainVC = MainViewController(viewModel: .init(coordinator: self))
        
        navigationController.setViewControllers([MainVC], animated: true)
        return navigationController
    }
}

searchVC 和 likePostVC 是一样的。

但是,我的执行结果如下:

在此处输入图像描述

为了快速解释,只显示了似乎必要的代码。 我想知道为什么我的执行结果是这样的。 请帮我

我看到两个问题:

  1. 使 parentConordinator weak以防止保留循环
  2. 您将相同的 navigationController 传递给所有选项卡根。 那行不通,可能是您看到的问题的原因。

我认为您的 tabBarController 需要一个协调器。 在该协调器的开始,您将您的子协调器添加到您的 tabBarCoordinator。

我总是在 tabBar 之前有登录流程,在 AppCoordinator 启动时我初始化登录并将 appCoordinator.rootViewController 设置为 loginCoordinator.rootViewController。 这就是我在 tabBar 中使用协调器的方式:

class AppCoordinator() {
      func start() { 
      // Mostly initializing login.
      // somehow loginCoordinator triggers coordinatorDelegate.goToTabBar()
   }

   func goToTabBar() {
    tabBarCoordinator = TabBarCoordinator(root: root, dependencies: dependencies)
    tabBarCoordinator.coordinatorDelegate = self
    tabBarCoordinator.start()
   }
}

下面是我启动 TabBarCoordinator 的方式:

class TabBarCoordinator {
 func start() { 
     let tabBarController = TabBarController()
     
     let firstCoordinator = //
     children.append(firstCoordinator)]
     firstCoordinator.start()
     
     let controller1 = UIViewController()
     controller1 = firstCoordinator.rootViewController

    // Do the same for second..
    
   tabBarController.viewControllers = [controller1, controller2]
   rootViewController.show(tabBarController, sender: nil)
   }

以下是如何初始化子协调器:

class FirstCoordinator {
    func start() { 
     let firstVC = FirstViewController()
     let navController = UINavigationController(rootViewController: firstVC)
     rootViewController = navController
    }  
}

我试图简化代码,它可能不是您正在寻找的直接答案,但我认为这将有助于理解模式。 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM