2017-09-29 19 views
10

Tôi đang chơi xung quanh với kiến ​​trúc MVVM-C, nhưng tôi không chắc chắn làm thế nào tôi có thể nhanh chóng nhiều điều phối viên với các tab khác nhau khi một tab được chọn.Làm thế nào để tôi sử dụng các điều phối viên với một UIITabBarController?

Dưới đây là chính lớp điều phối ứng dụng tôi ...

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 {} 

Vì vậy, làm thế nào tôi sẽ đi từ điều phối viên hiện tại (ProfileCoordinator) đến PlansCoordinator khi tab được chọn?

Trả lời

4

Cấu trúc Điều phối viên của tôi khác với của bạn, nhưng nó có thể giúp bạn. Trong trường hợp của tôi, giao thức Điều phối viên có thuộc tính rootViewController trỏ đến ViewController của Điều phối viên đó.

My AppCoordinator sau đó vẫn tồn tại một TabCoordinator, trông hơi như thế này: (Trong đoạn mã thực tế, các điều phối viên vẫn kiên trì là NavigationCoordinators, đó là điều phối viên đặc biệt mà giữ NavigationControllers Trong ví dụ này tôi chỉ cần thêm các ViewControllers và loại bỏ công cụ quản lý bộ nhớ. để làm cho nó dễ dàng hơn để hiểu được.)

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 

} 
} 

Vì vậy, về cơ bản, TabBarController của bạn là một TabCoordinator có của rootViewController là một TabBarController. TabCoordinator khởi tạo các Điều phối viên có liên quan và thêm rootViewControllers tương ứng vào tab.

Dưới đây là một việc thực hiện cơ bản của 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 
    } 
} 

Và một phiên bản cơ bản của một Coordinator:

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

I có thể xem ví dụ về một trong NavigationCoordinators của bạn? Xin lỗi vì hồi âm muộn. –

+1

Tôi đã chỉnh sửa trả lời của mình để bao gồm một ví dụ :) –

Các vấn đề liên quan