我最近受到了启发,学习了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()
函数返回某些感觉错误...
答案 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()
函数中确切控制何时将控制器的视图添加到视图层次结构中。