gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:53 25 4
gpt4 key购买 nike

我最近受到启发学习 MVVM-C(C 代表协调器),现在我正在尝试重写我当前的项目以使用它,但我正在努力弄清楚如何创建标签栏 Controller ,每个选项卡都有自己的协调器。

我有一个 LoginCoordinator,一旦用户登录,它就会创建一个 TabCoordinator应该创建 3 个协调器,每个协调器协调一个选项卡。

最明显的解决方案是让协调器的 start() 函数返回他们创建的 View Controller ,所以我想它看起来有点像这样:

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() 函数返回一些东西感觉有点不对劲......

最佳答案

我觉得呈现子协调器的 Controller 通常是父协调器的工作,所以我的 start() 函数是 func start(presentationHander: @escaping (UIViewController) -> ())TabCoordinatorstart() 函数看起来像这样:

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 呈现它的 Controller 。

我发现这让我在重用 Controller 时更加灵活。父协调器可以选择以模式呈现或将 Controller 推送到 UINavigationController 或 UITabBarController 中。子协调器不应该真正关心它被添加到的上下文。

至于 start() 返回 Controller 或接受闭包,甚至让协调器通过属性公开 Controller ,我不确定它是否重要。我选择了一个闭包,因为我想控制在 start() 函数期间 Controller 的 View 将被添加到 View 层次结构中的确切时间。

关于ios - 如何创建 UITabBarController 并将其选项卡与协调器连接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44479493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com