Bibi's DevLog ๐ค๐
[iOS] Coordinator (2) - ์ฝ๋๋ค์ดํฐ ํจํด, ์์ ์ ํจ๊ป ๊ตฌํํ๊ธฐ ๋ณธ๋ฌธ
[iOS] Coordinator (2) - ์ฝ๋๋ค์ดํฐ ํจํด, ์์ ์ ํจ๊ป ๊ตฌํํ๊ธฐ
๋น๋น bibi 2022. 11. 25. 01:13โ๏ธ ์ด ๊ธ์ ์๋ฆฌ์ฆ๋ ์๋์ ์ธ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์์ฑ๋์์ต๋๋ค.
How to use the coordinator pattern in iOS apps
โ๏ธ ์๋์ ๋ ๋ฌธ์๋ ์กฐ์ ํ๊ฒ๋๋ง ๋ฒ์ญ์ ํด ๋์์ผ๋ ํน์ ํ์ํ์ ๋ถ ์ฐธ๊ณ ํ์ธ์.
- How to use the coordinator pattern in iOS apps ํด์ ๋ฐ ์ ๋ฆฌ
- Advanced coordinators in iOS ํด์ ๋ฐ ์ ๋ฆฌ
โ๏ธ ์ด์ ํธ์ธ (1) - ์ฝ๋๋ค์ดํฐ ๊ฐ๋ ์ดํดํ๊ธฐ๋ ์ฌ๊ธฐ์ ์์ต๋๋ค.
โ๏ธ ๋ ธ์ ์ด ๋ ํธํ์๋ค๋ฉด ์ฌ๊ธฐ์ 1,2ํธ ํตํฉ๋ณธ ๋ฅผ ํ์ธํด ์ฃผ์ธ์.
Coordinator ๊ตฌํ
์ด์ ์ค๋ช ์ ๋ง์น๊ณ ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ๊ตฌํํด ๋ด ์๋ค.
์์ ํ๋ก์ ํธ์ธ CoordinatorPractice๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค.
CoordinatorPractice์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. Coordinator ํ๋กํ ์ฝ ๋ง๋ค๊ธฐ
๊ฐ์ฅ ๋จผ์ , ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ(AppCoordinator)์ ์์ ์ฝ๋๋ค์ดํฐ๊ฐ ์ค์ํ ํ๋กํ ์ฝ์ ๋ง๋ญ๋๋ค.
Coordinator ํ๋กํ ์ฝ
import UIKit
protocol Coordinator: AnyObject {
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
func start()
}
childCoordinators
: ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ ์ฅ- ๋ชจ๋ ์ฝ๋๋ค์ดํฐ๋ ์์ ์ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
navigationController
: ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณด์ฌ์ค ๋ ์ฌ์ฉ๋ ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ฅ.- โ๏ธ ๋ด๋น๊ฒ์ด์ ๋ฐ๋ฅผ ํ์ํ์ง ์๋๋ผ๋, ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ด๋ค.
start()
: ํด๋น ์ฝ๋๋ค์ดํฐ๊ฐ ์ ์ด๊ถ์ ๊ฐ๋๋ก ํ๋ ๋ฉ์๋. ์์ ํ ๋ง๋ค๊ณ ์ค๋น๋์์ ๋๋ง ์ฝ๋๋ค์ดํฐ๋ฅผ ํ์ฑํํจ.AnyObject
: ํด๋์ค์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋กํ ์ฝ์์ ๋ช ์
2. AppCoordinator(๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ) ๋ง๋ค๊ธฐ
AppCoordinator๋ ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ๋ก,
์ฑ ์คํ๊ณผ ๋์์ ์ฑ์ ๋ํ ์ ์ด๊ถ์ ๊ฐ๋ ์ฒซ ๋ฒ์งธ ์ฝ๋๋ค์ดํฐ์ด๋ค.
์์ ์ฝ๋๋ค์ดํฐ๊น์ง ์๋ ๊ฒฝ์ฐ, AppCoordinator๋ผ๊ณ ์ด๋ฆ์ง๊ธฐ๋ ํ๋ค.
AppCoordinator
import Foundation
import UIKit
class AppCoordinator: NSObject, Coordinator, UINavigationControllerDelegate {
var childCoordinators: [Coordinator] = [] // child coordinator๊ฐ ํ ๋น ํด์ ๋๋๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ
var navigationController: UINavigationController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
navigationController.delegate = self
showLoginViewController()
}
private func showHomeViewController() {
// ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๋ง๋ค๊ณ ์ ์ด๊ถ์ ๊ฐ๊ฒ ํจ(start ํธ์ถ)
let child = HomeCoordinator(navigationController: navigationController)
childCoordinators.append(child)
child.start()
child.parentCoordinator = self
}
private func showLoginViewController() {
// ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๋ง๋ค๊ณ ์ ์ด๊ถ์ ๊ฐ๊ฒ ํจ(start ํธ์ถ)
let child = LoginCoordinator(navigationController: navigationController)
childCoordinators.append(child)
child.start()
child.parentCoordinator = self
}
func didLoggedIn() {
navigationController.popViewController(animated: true)
showHomeViewController()
print("๋ก๊ทธ์ธ -> ํ")
}
func didLoggedOut() {
navigationController.popViewController(animated: true)
print("ํ -> ๋ก๊ทธ์ธ")
}
}
- ํด๋น ์ฝ๋๋ค์ดํฐ๊ฐ ๋ค๋ฅธ ๋ทฐ์ปจ๋ค์ ์ํด ๊ณต์ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, struct๋ณด๋ค class๋ก ์ ์ธ
- Coordinator ํ๋กํ ์ฝ์ ์ค์
start()
: ViewController ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , navigationController์ pushํ๋ค.didLoggedIn()
,didLoggedOut()
: ์์ ์ฝ๋๋ค์ดํฐ๋ค์ด ํ๋ฉด ์ ํ์ ์ํด AppCoordinator๋ก๋ถํฐ ํธ์ถํ๋ ๋ฉ์๋์ ๋๋ค.- ํ๋ฉด ์ ํ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ ํํ ํ๋ฉด์ ๋ด๋นํ๋ ์์ ์ฝ๋๋ค์ดํฐ๋ค์ ๋จผ์ ์์ฑํ๊ณ , ๊ทธ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์คํ์ํต๋๋ค -
showHomeViewController()
,showLoginViewController()
์ฐธ์กฐ
- ํ๋ฉด ์ ํ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ ํํ ํ๋ฉด์ ๋ด๋นํ๋ ์์ ์ฝ๋๋ค์ดํฐ๋ค์ ๋จผ์ ์์ฑํ๊ณ , ๊ทธ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์คํ์ํต๋๋ค -
โ AppCoordinator๊ฐ ์ NSObject๋ฅผ ์์ํ๊ณ UINavigationControllerDelegate๋ฅผ ์ค์ํ๋์?
โ๏ธ ์ด ๋ถ๋ถ์ ์กฐ๊ธ ์ด๋ ค์ด๋ฐ, ๋ฐ๋ก ์๋ ๋จ๋ฝ์ ๋๋์ด ์ค๋ช ํด ๋์์ต๋๋ค.
3. AppCoordinator์ UINavigationControllerDelegate ์ฑํ ํ didShow()
๋ฉ์๋ ๊ตฌํํ๊ธฐ
์ด ์์ ์ AppCoordinator๊ฐ ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ์์ ์ํธ์์ฉ์ ์ง์ ์ ์ผ๋ก ๊ฐ์งํ๋๋ก ํ๋ ์์ ์ ๋๋ค.
AppCoordinator์ ์ ์ฝ๋์ ์๋ ๋ฉ์๋๋ค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
โ ์ ์ด ์์ ์ ํ๋์?
โ๏ธ โ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ค๋ก ์ด๋ํ๋ ๊ฒ์ AppCoordinator๊ฐ ์ฒ๋ฆฌํด ์ฃผ๊ธฐ ์ํด์์ ๋๋คโ
- ๋ด๋น๊ฒ์ด์ ๋ฐ์์ ๋ค๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ pop๋ฉ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ฌ๋ผ์ง๋ฉด ๊ทธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํ๋ ์์ ์ฝ๋๋ค์ดํฐ๋ ๋ ์ด์ ํ์๊ฐ ์์ผ๋ฏ๋ก, childCoordinators ์์ ์ง์ ์ฃผ์ด์ผ ํฉ๋๋ค.
- ํ์ง๋ง ๋ค๋ก ๊ฐ๋ ์์ ์ Coordinator์ ์ํด ๋ฐ๋๋์ง ์์ผ๋ฏ๋ก ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋กญ์ต๋๋ค.
โ๏ธ ๋คํํ UINavigationControllerDelegate ํ๋กํ ์ฝ๋ก ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ๊น๋ํ๊ฒ ๋ชจ๋ํฐ๋ง ํ ์ ์์ต๋๋ค.
- ๊ทธ๋ผ ๋ด๋น๊ฒ์ด์
์ปจํธ๋กค๋ฌ์์ ์ง์ ํ๋ฉด์ด ๋ญ์๋์ง ์ด๋ป๊ฒ ์ ์ ์๋์??
- ๊ทธ๊ฑธ ์๊ธฐ ์ํด 1. UINavigationControllerDelegate ๋ฅผ ์ฑํํด 2. ์๋์
navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค - ๊ณต์๋ฌธ์ - ์ด ๋ฉ์๋๋ ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ์ ๋ด๋น๊ฒ์ด์ ์์ดํ ํ๋กํผํฐ๋ฅผ ํ์ํ โ์ดํโ์ ๋๋ฆฌ์(delegate)์๊ฒ ์๋ฆฌ๋ ๋ฉ์๋์ ๋๋ค.
- ํ๋ฉด์ ํ์ด ์์๋ค๋ฉด, push๋ pop์ด๋ ๊ด๊ณ์์ด ํ๋ฉด ์ ํ ์ดํ์ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ๊ทธ๊ฑธ ์๊ธฐ ์ํด 1. UINavigationControllerDelegate ๋ฅผ ์ฑํํด 2. ์๋์
NSObject
๋ฅผ ์์ํ๋ ์ด์ ๋, ์ด๋ฅผ ์์ํด์ผ๋งUINavigationControllerDelegate
ํ๋กํ ์ฝ์ ์ฑํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ณด์ฌ์ง ๋๋ง๋ค ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ AppCoordinator์๊ฒ ์๋ ค ์ค ๊ฒ์ ๋๋ค!
// AppCoordinator.swift
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
print("viewControllers : \(navigationController.viewControllers)")
print("childCoordinators : \(childCoordinators)")
// ์ด๋ค ๋ทฐ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ์ด๋ํด ์๋์ง ์กฐํ
guard let fromViewController = navigationController.transitionCoordinator?.viewController(forKey: .from) else {
return
}
// ํด๋น ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ์ปจํธ๋กค๋ฌ ๋ฐฐ์ด์ ์กด์ฌํ๋์ง ํ์ธ. ๋ง์ฝ ์กด์ฌํ๋ค๋ฉด, pop์ด ์๋ push๋ฅผ ํ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ก ์ฒ๋ฆฌํ ์์
์ ์๋ค.
if navigationController.viewControllers.contains(fromViewController) {
return
}
// ์ฌ๊ธฐ๊น์ง ๋๋ฌํ๋ค๋ฉด ํด๋น ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ์ปจํธ๋กค๋ฌ ๋ฐฐ์ด์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๋ฉฐ, ์ด๋ pop์ด ๋์์์ ์๋ฏธํ๋ค.
// ๋ฐ๋ผ์ ์ด๋ค ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ pop๋์๋์ง ํ์ธ ํ, ๊ทธ ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํ๋ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ childCoordinators๋ก๋ถํฐ ์ง์ ์ฃผ์ด์ผ ํ๋ค.
if let homeViewController = fromViewController as? HomeViewController {
print("HomeVC์ ์ฝ๋๋ค์ดํฐ ์ญ์ ")
childDidFinish(homeViewController.coordinator)
}
if let loginViewController = fromViewController as? LoginViewController {
print("LoginVC์ ์ฝ๋๋ค์ดํฐ ์ญ์ ")
childDidFinish(loginViewController.coordinator)
}
print("viewControllers : \(navigationController.viewControllers)")
print("childCoordinators : \(childCoordinators)")
}
func childDidFinish(_ child: Coordinator?) {
for (index, coordinator) in childCoordinators.enumerated() {
if coordinator === child {
childCoordinators.remove(at: index)
print("\(child) ์ญ์ ํจ")
break
}
}
}
func navigationController - didShow()
- ์ด์ ์ ์ด๋ค ๋ทฐ์ปจ์ผ๋ก๋ถํฐ ์ด๋ํ๋์ง ์ฝ์ด๋ธ๋ค
- ์ด์ ๋ทฐ์ปจ์ด ์์ง navigationStack์ ์กด์ฌํ๋ค๋ฉด : pop์ด ์๋ push๋์์ผ๋ก ์ธ์๋ ๊ฒ์
- ์๋ฌด ์กฐ์น๋ ํ ํ์ ์๋ค (return)
- ์ด์ ๋ทฐ์ปจ์ด navigationStack์ ์กด์ฌํ์ง ์๋๋ค๋ฉด : pop๋ ๊ฒ์ด ๋ง์
- pop๋ ๋ทฐ์ปจ์ coordinator๋ฅผ ์ฝ์ด์์ childCoordinators์์ ์ญ์ ํด ์ค์ผ ํจ
- ๋ฐ๋ผ์ push์๋ค๋ฉด ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ง๋ง, pop์ด์๋ค๋ฉด ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฒ๋ฆฌํด ์ฃผ์ด์ผ ํฉ๋๋ค. (์๋ ์ฝ๋ ์ฐธ๊ณ )
if let โฆ
์ผ๋ก ์์ํ๋ ์ฝ๋๋ ๋ทฐ ์ปจํธ๋กค๋ฌ ํ๋๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฐ๋ณต๋ฉ๋๋ค.- ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ณ๋์ ๊ฒ์๋ฌผ ์ ์ ๋ฆฌํด ๋์์ต๋๋ค.
func childDidFinish(_ child: Coordinator?)
- AppCoordinator์ childCoordinators ๋ชฉ๋ก์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฐพ์ ์ญ์ ํ๋ ์ญํ ์ ํ๋ ๋ฉ์๋์ ๋๋ค.
4. AppDelegate์ AppCoordinator ์ถ๊ฐํ๊ธฐ
์ฑ์ด ์์ํ ๋ AppCoordinator๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
AppDelegate
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var coordinator: AppCoordinator?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// ์ฑ์์ ์ฌ์ฉ๋ ๋ฉ์ธ ๋ด๋น๊ฒ์ด์
์ปจํธ๋กค๋ฌ ์์ฑ
let navigationController = UINavigationController()
// ์ฑ ์ฝ๋๋ค์ดํฐ์ ๋ค๋น๊ฒ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ ๋ฃ์ - ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด
coordinator = AppCoordinator(navigationController: navigationController)
// ์ฝ๋๋ค์ดํฐ๊ฐ ์ ์ด๊ถ์ ๊ฐ๋๋ก ์ง์
coordinator?.start()
// ๊ธฐ๋ณธ UIWindow๋ฅผ ๋ง๋ค๊ณ ํ์ฑํํ๊ธฐ
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
return true
}
}
var coordinator: AppCoordinator?
- ์ฑ์ ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ ์ฅํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๊ฒ์ ๋ฐฉ์งํจ
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
- MainCoordinator๋ฅผ ๊ตฌ์ฑ ๋ฐ ์คํ
- ์ฑ์ ๊ธฐ๋ณธ window๋ฅผ ์ค์
- (์๋ ๊ธฐ๋ณธ window๋ ์คํ ๋ฆฌ๋ณด๋์ ์ํด ์ค์ ๋์ง๋ง, ์ด์ ๋ ์ฐ๋ฆฌ์ ์ฑ ์์ด๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค)
5. ๋ทฐ ์ปจํธ๋กค๋ฌ ๋ง๋ค๊ธฐ
์ฒซ ํ๋ฉด์ธ ๋ก๊ทธ์ธ ํ๋ฉด๊ณผ ํ ํ๋ฉด์ ๋ง๋ค์ด ๋ด ๋๋ค.
LoginViewController
import Foundation
import UIKit
class LoginViewController: UIViewController {
weak var coordinator: LoginCoordinator?
override func viewDidLoad() {
super.viewDidLoad()
let loginItem = UIBarButtonItem(title: "๋ก๊ทธ์ธ", style: .plain, target: self, action: #selector(loginButtonDidTap))
self.navigationItem.rightBarButtonItem = loginItem
}
deinit {
print("\(type(of: self)) deinit")
}
@objc
func loginButtonDidTap() {
coordinator?.login()
}
}
HomeViewController
import Foundation
import UIKit
class HomeViewController: UIViewController {
weak var coordinator: HomeCoordinator?
override func viewDidLoad() {
super.viewDidLoad()
let item = UIBarButtonItem(title: "๋ก๊ทธ์์", style: .plain, target: self, action: #selector(logoutButtonDidTap))
self.navigationItem.rightBarButtonItem = item
}
deinit {
print("\(type(of: self)) deinit")
}
@objc
func logoutButtonDidTap() {
coordinator?.logout()
}
}
weak var coordinator: LoginCoordinator?
- ๋ชจ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค์ ์์ ์ ์ฝ๋๋ค์ดํฐ์ ๋ํํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๋ฐ๋ผ์ ์ฝํ์ฐธ์กฐ๋ก ์์ ์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
- โ ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ฝ๋๋ค์ดํฐ ๋์ ๊ฐ๋ณ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋งํฌ ์ฐธ์กฐ
6. ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํ ์์ ์ฝ๋๋ค์ดํฐ ๋ง๋ค๊ธฐ
- ์์ ์ฝ๋๋ค์ดํฐ์์ ํ๋ฉด์ ์ ํํ๋ ๋ฉ์๋๋
start()
๊ฐ ์๋์ด๋ ๋ฉ๋๋ค
LoginCoordiniator
import Foundation
import UIKit
class LoginCoordinator: Coordinator {
var childCoordinators: [Coordinator] = []
var navigationController: UINavigationController
weak var parentCoordinator: AppCoordinator?
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() { // VC ์ค์ ์ ์์ํ๋ ์ญํ
// loginVC ์
ํ
let viewController = LoginViewController()
viewController.coordinator = self
viewController.view.backgroundColor = .systemBrown
viewController.title = "Login"
navigationController.pushViewController(viewController, animated: true)
print("LoginViewController๋ฅผ ํ์ํฉ๋๋ค")
}
func login() {
parentCoordinator?.didLoggedIn()
}
}
HomeCoordinator
import Foundation
import UIKit
class HomeCoordinator: Coordinator {
var childCoordinators: [Coordinator] = []
var navigationController: UINavigationController
weak var parentCoordinator: AppCoordinator?
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
// homeVC ์
ํ
let viewController = HomeViewController()
viewController.coordinator = self
viewController.view.backgroundColor = .systemPurple
viewController.title = "Home"
navigationController.pushViewController(viewController, animated: true)
print("HomeViewController๋ฅผ ํ์ํฉ๋๋ค")
}
func logout() {
parentCoordinator?.didLoggedOut()
}
}
์์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ํ์์ ํ์ผ๋ณ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์ค๋ช ํ๋ค ๋ณด๋ ์์๋ ๋์ ๋ฐฉ์์ด ์ดํด๊ฐ ์ด๋ ค์ฐ์ค ๊ฒ ๊ฐ์ต๋๋ค(ใ ใ )
๊นํ ์ ์ฅ์ main ๋ธ๋์น์ ์ ์ฒด ์ฝ๋๊ฐ ์์ผ๋ ์คํํด๋ณด๋ฉฐ ์ค๋ช ์ ์ฝ์ผ์๋ ๊ฑธ ๊ฐ๋ ฅํ ์ถ์ฒ๋๋ฆฝ๋๋ค.
(๋ฒ์ธ) delegate๋ก ๋ถ๋ชจ์ฝ๋๋ค์ดํฐ-์์์ฝ๋๋ค์ดํฐ-๋ทฐ์ปจํธ๋กค๋ฌ ์ํตํ๊ธฐ
์ง๊ธ๊น์ง ์ค๋ช ํ ๋ฐฉ์์ ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ์ฝ๋๋ค์ดํฐ๋ฅผ ํ๋กํผํฐ๋ก ์์ ํ๋ ํจํด์ ๋๋ค.
parentCoordinator ํ๋กํผํฐ๋ฅผ ํตํด ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ-์์ ์ฝ๋๋ค์ดํฐ - ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ํํ๋ ๋ฒ์ .
์ด ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ delegate ํ๋กํ ์ฝ์ ํตํด ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ-์์ ์ฝ๋๋ค์ดํฐ - ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ํํ๋ ๋ฐฉ์์ผ๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์ ๊นํ ์ ์ฅ์์ delegate ๋ธ๋์น ์ delegate ํ๋กํ ์ฝ๋ก ๋์ํ๋ ๋ฒ์ ๋ ์ฌ๋ ค ๋์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด ๋ฐฉ์๋ณด๋ค ํ๋กํผํฐ๋ฅผ ์์ ํ๋ ๊ฒ ํ๋ฆ์ด ๋ ๋ณต์กํ๊ณ , ํจ์ฌ ์ง๊ด์ ์ผ๋ก ๋์ํด์ ์ข์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
์ธ์ ๊ฐ ์ ๋ฆฌํด์ผ์ง ์ ๋ฆฌํด์ผ์ง.. ํ๋ ์ฝ๋๋ค์ดํฐ ํจํด์ ๋๋์ด ์ ๋ฆฌํ๋ค์.
์ฝ๋๋ค์ดํฐ ํจํด์ ๋ฐฐ์ฐ๋ ๋ถ๋ค๊ป ์ด ๊ธ์ด ์กฐ๊ธ์ด๋ผ๋ ๋์์ด ๋์ จ์ผ๋ฉด ํฉ๋๋ค! ๐