Skip to content

Commit

Permalink
Merge pull request #17 from boostcampwm-2022/feature/Coordinators
Browse files Browse the repository at this point in the history
Coordinator와 DI 구현
  • Loading branch information
jinwoong16 committed Nov 16, 2022
2 parents 5180632 + dedabd4 commit 1a87f9f
Show file tree
Hide file tree
Showing 14 changed files with 468 additions and 6 deletions.
90 changes: 87 additions & 3 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@
3499552729235D1E007AB99E /* BrowseItemViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3499552629235D1E007AB99E /* BrowseItemViewModel.swift */; };
349955292923600A007AB99E /* BrowseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349955282923600A007AB99E /* BrowseViewController.swift */; };
3499552B29236041007AB99E /* BrowseViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3499552A29236041007AB99E /* BrowseViewModel.swift */; };
34A529D129247880001BAD34 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529D029247880001BAD34 /* Coordinator.swift */; };
34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529D229247903001BAD34 /* TabCoordinator.swift */; };
34A529D529247932001BAD34 /* AppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529D429247932001BAD34 /* AppCoordinator.swift */; };
34A529D829247A87001BAD34 /* HomeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529D729247A87001BAD34 /* HomeCoordinator.swift */; };
34A529DA29247B9C001BAD34 /* AppDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529D929247B9C001BAD34 /* AppDIContainer.swift */; };
34A529DC29247BB6001BAD34 /* HomeSceneDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529DB29247BB6001BAD34 /* HomeSceneDIContainer.swift */; };
34A529E029247F1F001BAD34 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529DF29247F1F001BAD34 /* HomeViewController.swift */; };
34A529E22924816A001BAD34 /* BrowseSceneDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529E12924816A001BAD34 /* BrowseSceneDIContainer.swift */; };
34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529E329248178001BAD34 /* SettingsSceneDIContainer.swift */; };
34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529E6292481E1001BAD34 /* BrowseCoordinator.swift */; };
34A529E929248B58001BAD34 /* AppAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A529E829248B58001BAD34 /* AppAppearance.swift */; };
34ACC32D291DE9C000741371 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC32C291DE9C000741371 /* AppDelegate.swift */; };
34ACC32F291DE9C000741371 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC32E291DE9C000741371 /* SceneDelegate.swift */; };
34ACC336291DE9C100741371 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC335291DE9C100741371 /* Assets.xcassets */; };
Expand Down Expand Up @@ -67,6 +78,17 @@
3499552629235D1E007AB99E /* BrowseItemViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseItemViewModel.swift; sourceTree = "<group>"; };
349955282923600A007AB99E /* BrowseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewController.swift; sourceTree = "<group>"; };
3499552A29236041007AB99E /* BrowseViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewModel.swift; sourceTree = "<group>"; };
34A529D029247880001BAD34 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
34A529D229247903001BAD34 /* TabCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabCoordinator.swift; sourceTree = "<group>"; };
34A529D429247932001BAD34 /* AppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinator.swift; sourceTree = "<group>"; };
34A529D729247A87001BAD34 /* HomeCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCoordinator.swift; sourceTree = "<group>"; };
34A529D929247B9C001BAD34 /* AppDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDIContainer.swift; sourceTree = "<group>"; };
34A529DB29247BB6001BAD34 /* HomeSceneDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSceneDIContainer.swift; sourceTree = "<group>"; };
34A529DF29247F1F001BAD34 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = "<group>"; };
34A529E12924816A001BAD34 /* BrowseSceneDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseSceneDIContainer.swift; sourceTree = "<group>"; };
34A529E329248178001BAD34 /* SettingsSceneDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSceneDIContainer.swift; sourceTree = "<group>"; };
34A529E6292481E1001BAD34 /* BrowseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseCoordinator.swift; sourceTree = "<group>"; };
34A529E829248B58001BAD34 /* AppAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAppearance.swift; sourceTree = "<group>"; };
34ACC329291DE9C000741371 /* DailyQuest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DailyQuest.app; sourceTree = BUILT_PRODUCTS_DIR; };
34ACC32C291DE9C000741371 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
34ACC32E291DE9C000741371 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -147,6 +169,10 @@
3499551329232525007AB99E /* DIContainer */ = {
isa = PBXGroup;
children = (
34A529D929247B9C001BAD34 /* AppDIContainer.swift */,
34A529DB29247BB6001BAD34 /* HomeSceneDIContainer.swift */,
34A529E12924816A001BAD34 /* BrowseSceneDIContainer.swift */,
34A529E329248178001BAD34 /* SettingsSceneDIContainer.swift */,
);
path = DIContainer;
sourceTree = "<group>";
Expand Down Expand Up @@ -176,15 +202,19 @@
34995519292332A9007AB99E /* Home */ = {
isa = PBXGroup;
children = (
34A529DE29247F13001BAD34 /* ViewModel */,
34A529DD29247F0C001BAD34 /* ViewController */,
34A529D629247A52001BAD34 /* Flow */,
);
path = Home;
sourceTree = "<group>";
};
3499551A292332B2007AB99E /* Browse */ = {
isa = PBXGroup;
children = (
3499552429235034007AB99E /* View */,
3499552429235034007AB99E /* ViewController */,
349955252923503C007AB99E /* ViewModel */,
34A529E5292481C9001BAD34 /* Flow */,
);
path = Browse;
sourceTree = "<group>";
Expand All @@ -207,12 +237,12 @@
path = Cells;
sourceTree = "<group>";
};
3499552429235034007AB99E /* View */ = {
3499552429235034007AB99E /* ViewController */ = {
isa = PBXGroup;
children = (
349955282923600A007AB99E /* BrowseViewController.swift */,
);
path = View;
path = ViewController;
sourceTree = "<group>";
};
349955252923503C007AB99E /* ViewModel */ = {
Expand All @@ -224,6 +254,46 @@
path = ViewModel;
sourceTree = "<group>";
};
34A529CF29247875001BAD34 /* Protocols */ = {
isa = PBXGroup;
children = (
34A529D029247880001BAD34 /* Coordinator.swift */,
34A529D229247903001BAD34 /* TabCoordinator.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
34A529D629247A52001BAD34 /* Flow */ = {
isa = PBXGroup;
children = (
34A529D729247A87001BAD34 /* HomeCoordinator.swift */,
);
path = Flow;
sourceTree = "<group>";
};
34A529DD29247F0C001BAD34 /* ViewController */ = {
isa = PBXGroup;
children = (
34A529DF29247F1F001BAD34 /* HomeViewController.swift */,
);
path = ViewController;
sourceTree = "<group>";
};
34A529DE29247F13001BAD34 /* ViewModel */ = {
isa = PBXGroup;
children = (
);
path = ViewModel;
sourceTree = "<group>";
};
34A529E5292481C9001BAD34 /* Flow */ = {
isa = PBXGroup;
children = (
34A529E6292481E1001BAD34 /* BrowseCoordinator.swift */,
);
path = Flow;
sourceTree = "<group>";
};
34ACC320291DE9C000741371 = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -280,9 +350,12 @@
34ACC367291DF00B00741371 /* Application */ = {
isa = PBXGroup;
children = (
34A529CF29247875001BAD34 /* Protocols */,
3499551329232525007AB99E /* DIContainer */,
34ACC32C291DE9C000741371 /* AppDelegate.swift */,
34ACC32E291DE9C000741371 /* SceneDelegate.swift */,
34A529D429247932001BAD34 /* AppCoordinator.swift */,
34A529E829248B58001BAD34 /* AppAppearance.swift */,
);
path = Application;
sourceTree = "<group>";
Expand Down Expand Up @@ -462,21 +535,32 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
34A529D129247880001BAD34 /* Coordinator.swift in Sources */,
3499552029234637007AB99E /* CustomProgressBar.swift in Sources */,
34A529E22924816A001BAD34 /* BrowseSceneDIContainer.swift in Sources */,
34A529E929248B58001BAD34 /* AppAppearance.swift in Sources */,
3499552329234D5F007AB99E /* BrowseCell.swift in Sources */,
3499551E29233DEF007AB99E /* QuestCell.swift in Sources */,
34A529DC29247BB6001BAD34 /* HomeSceneDIContainer.swift in Sources */,
34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */,
34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */,
3449AD5D2922197000B87619 /* User.swift in Sources */,
34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */,
34A529E029247F1F001BAD34 /* HomeViewController.swift in Sources */,
34A529D529247932001BAD34 /* AppCoordinator.swift in Sources */,
B50078D629222F3F0070AFC4 /* CircleCheckView.swift in Sources */,
3499552729235D1E007AB99E /* BrowseItemViewModel.swift in Sources */,
349955292923600A007AB99E /* BrowseViewController.swift in Sources */,
B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */,
3499551529232533007AB99E /* UIColor+.swift in Sources */,
34A529DA29247B9C001BAD34 /* AppDIContainer.swift in Sources */,
34ACC32D291DE9C000741371 /* AppDelegate.swift in Sources */,
3499552B29236041007AB99E /* BrowseViewModel.swift in Sources */,
3449AD5B2922164B00B87619 /* Quest.swift in Sources */,
349955122923220E007AB99E /* SwiftUIPreview.swift in Sources */,
3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */,
34ACC32F291DE9C000741371 /* SceneDelegate.swift in Sources */,
34A529D829247A87001BAD34 /* HomeCoordinator.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
15 changes: 15 additions & 0 deletions DailyQuest/DailyQuest/Application/AppAppearance.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// AppAppearance.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import UIKit

final class AppAppearance {
static func setupAppearance() {
UITabBar.appearance().backgroundColor = .white
UITabBar.appearance().tintColor = .maxYellow
}
}
71 changes: 71 additions & 0 deletions DailyQuest/DailyQuest/Application/AppCoordinator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// AppCoordinator.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import UIKit

final class AppCoordinator: NSObject, TabCoordinator, UITabBarControllerDelegate {
weak var finishDelegate: CoordinatorFinishDelegate?
var tabBarController: UITabBarController
var childCoordinators: [Coordinator] = []
let appDIContainer: AppDIContainer

init(tabBarController: UITabBarController,
appDIContainer: AppDIContainer) {
self.tabBarController = tabBarController
self.appDIContainer = appDIContainer
}

func start() {
let pages: [TabBarPage] = [.home, .browse, .settings]
let controllers: [UINavigationController] = pages.map(getTabController(_:))

prepareTabBarController(withTabControllers: controllers)
}

private func prepareTabBarController(withTabControllers tabControllers: [UIViewController]) {
tabBarController.delegate = self
tabBarController.setViewControllers(tabControllers, animated: true)
tabBarController.selectedIndex = TabBarPage.home.pageOrderNumber()
tabBarController.tabBar.isTranslucent = false

}

private func getTabController(_ page: TabBarPage) -> UINavigationController {
let navController = UINavigationController()
navController.setNavigationBarHidden(false, animated: false)

navController.tabBarItem = UITabBarItem.init(title: page.pageTitleValue(),
image: page.pageIcon(),
tag: page.pageOrderNumber())

switch page {
case .home:
let homeSceneDIContainer = appDIContainer.makeHomeSceneDIContainer()
let homeCoordinator = homeSceneDIContainer.makeHomeCoordinator(navigationController: navController,
homeSceneDIContainer: homeSceneDIContainer)
homeCoordinator.start()
childCoordinators.append(homeCoordinator)
break
case .browse:
let browseSceneDIContainer = appDIContainer.makeBrowseSceneDIContainer()
let browseCoordinator = browseSceneDIContainer.makeBrowseCoordinator(navigationController: navController,
browseSceneDIContainer: browseSceneDIContainer)
browseCoordinator.start()
childCoordinators.append(browseCoordinator)
case .settings:
break
}

return navController
}
}

extension AppCoordinator: CoordinatorFinishDelegate {
func coordinatorDidFinish(childCoordinator: Coordinator) {

}
}
20 changes: 20 additions & 0 deletions DailyQuest/DailyQuest/Application/DIContainer/AppDIContainer.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// AppDIContainer.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import Foundation

final class AppDIContainer {

func makeHomeSceneDIContainer() -> HomeSceneDIContainer {
return HomeSceneDIContainer()
}

func makeBrowseSceneDIContainer() -> BrowseSceneDIContainer {
return BrowseSceneDIContainer()
}
// func makeSettingsSceneDIContainer() -> SettingsDIContainer
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// BrowseSceneDIContainer.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import UIKit

final class BrowseSceneDIContainer {

// MARK: - Repositories

// MARK: - Use Cases

// MARK: - View Models
func makeBrowseViewModel() -> BrowseViewModel {
return BrowseViewModel()
}

// MARK: - View Controller
func makeBrowseViewController() -> BrowseViewController {
return BrowseViewController.create(with: makeBrowseViewModel())
}

// MARK: - Flow
func makeBrowseCoordinator(navigationController: UINavigationController,
browseSceneDIContainer: BrowseSceneDIContainer) -> BrowseCoordinator {
return DefaultBrowseCoordinator(navigationController: navigationController,
browseSceneDIContainer: browseSceneDIContainer)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// HomeSceneDIContainer.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import UIKit

final class HomeSceneDIContainer {

// MARK: - Repositories

// MARK: - Use Cases

// MARK: - View Models

// MARK: - View Controller
func makeHomeViewController() -> HomeViewController {
return HomeViewController.create()
}

// MARK: - Flow
func makeHomeCoordinator(navigationController: UINavigationController,
homeSceneDIContainer: HomeSceneDIContainer) -> HomeCoordinator {
return DefaultHomeCoordinator(navigationController: navigationController,
homeSceneDIContainer: homeSceneDIContainer)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//
// SettingsSceneDIContainer.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import Foundation
27 changes: 27 additions & 0 deletions DailyQuest/DailyQuest/Application/Protocols/Coordinator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// Coordinator.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/16.
//

import UIKit

protocol Coordinator: AnyObject {
var finishDelegate: CoordinatorFinishDelegate? { get set }
var childCoordinators: [Coordinator] { get set }

func start()
func finish()
}

extension Coordinator {
func finish() {
childCoordinators.removeAll()
finishDelegate?.coordinatorDidFinish(childCoordinator: self)
}
}

protocol CoordinatorFinishDelegate: AnyObject {
func coordinatorDidFinish(childCoordinator: Coordinator)
}
Loading

0 comments on commit 1a87f9f

Please sign in to comment.