最近,我学习了MVVM(用于协调员的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()函数返回某种感觉是不对的。
发布于 2017-06-12 21:05:32
我觉得通常由父协调器来显示子协调器的控制器,所以我的start()函数是func start(presentationHander: @escaping (UIViewController) -> ())。用于start()的TabCoordinator函数如下所示:
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()函数期间控制器的视图将被添加到视图层次结构的确切时间。
https://stackoverflow.com/questions/44479493
复制相似问题