Ios 如何创建UITabBarController并将其选项卡与协调器连接?

Ios 如何创建UITabBarController并将其选项卡与协调器连接?,ios,swift,Ios,Swift,我最近受到了学习MVVM-C(协调器用C)的启发,现在我正试图重写我当前的项目以使用它,但我很难想出如何创建一个选项卡栏控制器,其中每个选项卡都有自己的协调器 我有一个LoginCoordinator,一旦用户登录,它将创建一个TabCoordinator,该选项卡将创建3个协调员,每个协调员协调一个选项卡 最明显的解决方案是让协调器的start()函数返回它们创建的视图控制器,因此我猜它看起来有点像这样: class TabCoordinator { func start() {

我最近受到了学习MVVM-C(协调器用C)的启发,现在我正试图重写我当前的项目以使用它,但我很难想出如何创建一个选项卡栏控制器,其中每个选项卡都有自己的协调器

我有一个
LoginCoordinator
,一旦用户登录,它将创建一个
TabCoordinator
,该选项卡将创建3个协调员,每个协调员协调一个选项卡

最明显的解决方案是让协调器的
start()
函数返回它们创建的视图控制器,因此我猜它看起来有点像这样:

class TabCoordinator {
  func start() {
    let fooCoordinator = FooCoordinator(...)
    let fooVC = fooCoordinator.start()

    // create other coordinators/VCs

    tabBarController.viewControllers = [fooVC, ...]
  }
}


class FooCoordinator {
  func start() -> UIViewController {
    let fooVC = FooViewController(...)
    // ...
    return fooVC
  }
}

我不确定我是否在正确的轨道上,或者是否有更好的方法,但是让
start()
函数返回某些东西感觉有点不对劲…

我觉得通常是父级协调器的工作来呈现子级协调器的控制器,所以我的
start()
函数是
func start(presentationHander:@escaping(UIViewController)->()
选项卡协调器的
start()
函数如下所示:

class TabCoordinator : Coordinator {
    func start(presentationHander: @escaping (UIViewController) -> ()) {
        let tabBarController = UITabBarController()
        var tabBarControllers = [UIViewController]()

        let fooCoordinator = FooCoordinator()
        fooCoordinator.start { (controller) in
            tabBarControllers.append(controller)
        }

        tabBarController.viewControllers = tabBarControllers
        presentationHander(tabBarController)
    }
}

class FooCoordinator : Coordinator {
    func start(presentationHander: @escaping (UIViewController) -> ()) {
        let fooVC = FooViewController.makeFromStoryboard()
        presentationHander(settingVC)
    }    
}
FooCoordinator负责初始化自己的依赖项,但允许TabCoordinator显示其控制器

我发现这在重用控制器时给了我更大的灵活性。父协调器可以选择以模态表示,也可以将控制器推送到UINavigationController或UITabBarController中。子协调器不应该真正关心添加到其中的上下文


至于
start()
返回控制器或接受闭包,甚至让协调器通过属性公开控制器,我不确定这有多重要。我选择闭包是因为我想控制
start()期间的确切时间
功能控制器的视图将添加到视图层次结构中。

您有什么解决方案吗?