2017-09-29 58 views
10

Używam architektury MVVM-C, ale nie jestem pewien, w jaki sposób mogę utworzyć wiele koordynatorów z różnymi kartami po wybraniu karty.Jak używać koordynatorów za pomocą kontrolera UIITabBarController?

Oto moja główna klasa aplikacji koordynator ...

protocol UINavigationControllerType: class { 
func pushViewController(_ viewController: UIViewController, animated: Bool) 
func popViewController(animated: Bool) -> UIViewController? 
} 

protocol Coordinator: class { 
func start() 
} 

final class AppCoordinator: Coordinator { 
// MARK: - Properties 
var managedObjectContext: NSManagedObjectContext! 
var coordinators = [String : Coordinator]() 

var tabController: UITabBarController? 

// MARK: - Object Lifecycle 
init(moc: NSManagedObjectContext, tabController: UITabBarController) { 
    self.managedObjectContext = moc 
    self.tabController = tabController 
} 

// MARK: - Coordinator 
func start() { 
    guard let tabController = tabController else {return} 

    let profileNavigationController = NavigationController() 
    profileNavigationController.tabBarItem = UITabBarItem(title: "Profile", image: UIImage(named: "profileUnselected"), selectedImage: UIImage(named: "profileSelected")) 

    let plansNavigationController = NavigationController() 
    plansNavigationController.tabBarItem = UITabBarItem(title: "Plans", image: UIImage(named: "plansUnselected"), selectedImage: UIImage(named: "plansSelected")) 

    tabController.viewControllers = [profileNavigationController, plansNavigationController] 
    tabController.selectedViewController = profileNavigationController 

    let profileCoordinator = ProfileCoordinator(navigationController: profileNavigationController) 
    profileCoordinator.managedObjectContext = managedObjectContext 
    coordinators["profileCoordinator"] = profileCoordinator 
    profileCoordinator.delegate = self 
    profileCoordinator.start() 
} 
} 

// MARK: - ProfileCoordinatorDelegate 
extension AppCoordinator: ProfileCoordinatorDelegate {} 

Więc jak pójdę z obecnego koordynatora (ProfileCoordinator) do PlansCoordinator kiedy wybrana jest zakładka?

Odpowiedz

4

Moja struktura koordynatora jest inna niż Twoja, ale może ci pomóc. W moim przypadku protokół Koordynatora ma właściwość rootViewController, która wskazuje kontroler ViewController tego koordynatora.

My AppCoordinator następnie utrzymuje TabCoordinator, który wygląda mniej więcej tak: (W prawdziwym kodzie, że trwają koordynatorzy są NavigationCoordinators, które są specjalne Koordynatorzy które posiadają NavigationControllers W tym przykładzie po prostu dodać ViewControllers i usunięte rzeczy zarządzania pamięcią. aby łatwiej zrozumieć.)

final class TabCoordinator: NSObject, Coordinator { 

var rootViewController: UIViewController { 
    return tabController 
} 

let tabController: UITabBarController 

let homeCoordinator: HomeCoordinator 
let historyCoordinator: HistoryCoordinator 
let profileCoordinator: ProfileCoordinator 

var coordinators: [Coordinator] { 
    return [homeCoordinator, historyCoordinator, profileCoordinator] 
} 

init(client: HTTPClient, persistence: Persistence) { 

    tabController = UITabBarController() 

    homeCoordinator = HomeCoordinator(client: client, persistence: persistence) 

    historyCoordinator = HistoryCoordinator(client: client, persistence: persistence) 

    profileCoordinator = ProfileCoordinator(client: client, persistence: persistence) 

    var controllers: [UIViewController] = [] 

    let homeViewController = homeCoordinator.rootViewController 
    homeViewController.tabBarItem = UITabBarItem(title: Localization.homeTab.string, image: Asset.iconMenuRecharge.image, selectedImage: Asset.iconMenuRechargeActivated.image) 

    let historyViewController = historyCoordinator.rootViewController 
    historyViewController.tabBarItem = UITabBarItem(title: Localization.walletTab.string, image: Asset.iconMenuWallet.image, selectedImage: Asset.iconMenuWalletActivated.image) 

    let profileViewController = profileCoordinator.rootViewController 
    profileViewController.tabBarItem = UITabBarItem(title: Localization.profileTab.string, image: Asset.iconMenuProfile.image, selectedImage: Asset.iconMenuProfileActivated.image) 

    super.init() 

    controllers.append(homeViewController) 
    controllers.append(historyViewController) 
    controllers.append(profileViewController) 

    tabController.viewControllers = controllers 
    tabController.tabBar.isTranslucent = false 
    tabController.delegate = self 

} 
} 

Więc zasadniczo swoją TabBarController jest TabCoordinator którego na rootViewController jest TabBarController. TabCoordinator tworzy odpowiednie Koordynatory i dodaje do nich odpowiednią rootViewControllers.

Oto podstawowe wdrożenie NavigationCoordinator:

class NavigationCoordinator: NSObject, Coordinator {  

    public var navigationController: UINavigationController  

    public override init() { 
     self.navigationController = UINavigationController() 
     self.navigationController.view.backgroundColor = .white 
     super.init() 
    }  

    public var rootViewController: UIViewController { 
     return navigationController 
    } 
} 

I podstawowa wersja Coordinator:

public protocol Coordinator: class {  
    var rootViewController: UIViewController { get }  
} 
+0

mogę zobaczyć przykład jednej ze swoich NavigationCoordinators? Przepraszam za późną odpowiedź. –

+1

Edytowałem moją odpowiedź, aby dołączyć przykład :) –