Architecture
iOS(UIKit)에서의 Coordinator Pattern
최지철
2023. 9. 18. 17:14
반응형
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()
}
}
반응형