簡體   English   中英

如何創建一個UITabBarController並將其選項卡與協調器連接?

[英]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) -> ()) 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展示其控制器。

我發現這在重用控制器時給了我更大的靈活性。 父級協調器可以選擇以模式顯示,也可以將控制器推入UINavigationController或UITabBarController中。 子協調器不應該真正在意添加它的上下文。

至於start()返回控制器或接受閉包,甚至讓協調器通過屬性公開控制器,我不確定這有多重要。 我選擇一個閉包是因為我想精確控制何時在start()函數中將控制器的視圖添加到視圖層次結構中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM