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