본문 바로가기
Architecture

iOS(UIKit)에서의 Coordinator Pattern

by 최지철 2023. 9. 18.
728x90
반응형

Coordinator 란?

  • 하나 이상의 뷰 컨트롤러들에게 지시를 내리는 객체
    • 지시는 view의 트랜지션(화면 전환)을 의미

 

사용하는 이유(이점)

  • 화면 전환시, Push,Present등 VC(ViewController) 내부에 작성되어진다. 그렇게되면 책임 또한 VC가 가지게 될 뿐만 아니라, VC간 의존성이 생긴다.
  • 위와 같은 상황에서 Coordinator 패턴을 적용하여 화면 전환의 흐름을 제어하게 된다면 VC가 담당하던 책임을 Coordinator가 담당하게 된다.
  • VC에서 사용할 VM(ViewModel)을 함께 주입해줄 수 있어 DI(의존성주입) 또한 쉽게 해결가능하다.
  • 즉 화면 전환 제어 담당과 의존성 주입을 하게 해주는 허브. VC가 갖고있는 FlowLogic을 떼어내, Massive해지지 않게 해주기도 

코디네이터 구현

기본적으로 상위에 AppCoordinator가 존재한다.

만들어보깅

 

 

우선,mainCoordinator 대신 LoginCoordinator로 대체하였다.

 

Protocol을 먼저 만든다.

public protocol Coordinator : AnyObject {
    var parentCoordinator: Coordinator? { get set }
    var childCoordinators: [Coordinator] { get set }
    var navigationController: UINavigationController { get }

    func start()
}
extension Coordinator {
  func removeChildCoordinator(child: Coordinator) {
    childCoordinators.removeAll { $0 === child }
  }
}

추상화한,coordinator를 구현


import Foundation
import UIKit

class AppCoordinator: Coordinator {
    var navigationController: UINavigationController
    
    var parentCoordinator: Coordinator?
    
    var childCoordinators: [Coordinator] = []
        
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    func start() {
        self.showLoginVC()
    }
    private func showLoginVC(){
        let coordinator = LoginCoordinator(navigationController: self.navigationController)
        self.childCoordinators.append(coordinator)
        coordinator.start()
    }

}

 

SceneDelegate

처음 시작시, AppCoordinator로 이동

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene)
        else {
            return
        }
        window = UIWindow(windowScene: windowScene)
        let navigationController = UINavigationController()
        window?.rootViewController = navigationController
        
        appCoordinator = AppCoordinator(navigationController: navigationController)
        appCoordinator?.start()

        window?.makeKeyAndVisible()
    }

 

LoginCoordinator(MainCoordinator)

//
//  LoginCoordinator.swift
//  WooYah-iOS
//
//  Created by 최지철 on 2023/09/17.
//

import Foundation
import UIKit


final class LoginCoordinator : Coordinator {
    var parentCoordinator: Coordinator?
    
    var childCoordinators: [Coordinator] = []
    
    var navigationController: UINavigationController
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    func start() {
        let vc = LoginViewController()
        self.navigationController.viewControllers = [vc]
    }
    func showHomeVC(){
        let coordinator = HomeCoordinator(navigationController: self.navigationController)
        self.childCoordinators.append(coordinator)
        coordinator.start()
    }
}

 

728x90
반응형

'Architecture' 카테고리의 다른 글

[Swift] 싱글톤(Singleton)패턴과 예제  (0) 2024.07.23
MVI (Model - View - Intent)  (1) 2024.06.07
iOS(UIKit)에서의 CleanArchitecture+MVVM 예시 뜯어보기  (0) 2023.09.15
MVVM in iOS  (0) 2023.09.04
MVP (Model - View - Present)  (0) 2023.08.28