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

时间:2017-06-11 01:07:40

标签: ios swift

我最近受到了启发,学习了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()函数返回某些感觉错误...

1 个答案:

答案 0 :(得分:1)

我觉得父母协调员的工作通常是提供儿童协调员的控制器,因此我的start()功能是func start(presentationHander: @escaping (UIViewController) -> ())start()的{​​{1}}函数看起来像这样:

TabCoordinator

FooCoordinator负责初始化自己的依赖关系,但允许TabCoordinator显示其控制器。

我发现这在重用控制器时给了我更大的灵活性。父协调器可以选择呈现为模态或将控制器推送到UINavigationController或UITabBarController。儿童协调员不应该真正关心它所添加的背景。

至于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) } } 返回一个控制器或接受一个闭包,或者甚至让协调员通过一个属性公开控制器,我不确定它是否重要。我选择了一个闭包,因为我希望在start()函数中确切控制何时将控制器的视图添加到视图层次结构中。