2017-06-11 4 views
2

私は最近、MVVM-C(コーディネーターのためのC)の勉強に励まされています。現在、私の現在のプロジェクトを書き直そうとしていますが、タブバーコントローラーを作成する方法が分かりません。各タブには独自のコーディネーターがあります。UITabBarControllerを作成し、そのタブをコーディネーターに接続するにはどうすればいいですか?

私は、ユーザーがログインすると、LoginCoordinatorを持っているが、 3人のコーディネーター、タブの調整をそれぞれ作成する必要があることをTabCoordinatorを作成します。

最も明白な解決策は、彼らが作成するビューコントローラを返すために、コーディネータの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()関数を返すと何とか何かが返ってきます...

答えて

0

私は通常、子コーディネーターのコントローラーを提示する親コーディネーターの仕事だと感じています。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()関数の間にコントローラのビューがビュー階層に追加されたときを正確に制御したいのでクロージャを選択しました。

関連する問題