[英]How to create a UITabBarController and connect its tabs with coordinators?
我最近受到啟發來學習MVVM-C(協調員的C語言),而現在我試圖重寫我的當前項目以使用它,但我一直在努力尋找如何創建選項卡欄控制器的方法,其中每個選項卡有自己的協調員。
我有一個LoginCoordinator
,一旦用戶登錄,它就會創建一個TabCoordinator
,該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) -> ())
。 TabCoordinator
的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()
函數中將控制器的視圖添加到視圖層次結構中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.