Slide 1

Slide 1 text

Coordinatorύλʔϯͷ࣮ફ @yoshikuni_kato potato%ps #38 2017/03/22 1

Slide 2

Slide 2 text

Who am I? • Ճ౻༝܇ʢYoshikuni Katoʣ @yoshikuni_kato • iOSΤϯδχΞ • Yahoo! Japan -> Φϋί • ʮϥδ΁͐ʯ͘Μ → • Interests: ઃܭ / FRP / Coordinator PaCern / UI࣮૷ 2

Slide 3

Slide 3 text

Agenda • Coordinatorύλʔϯͷ࣮૷ྫΛ঺հ͍ͨ͠ • Coordinator: ը໘ભҠͷϩδοΫΛVC͔Β੾Γग़ͨ͠΋ͷ • աڈͷࢿྉʢը໘ભҠͷ؅ཧͱMVVMʣΛࢀর͍ͩ͘͞ 3

Slide 4

Slide 4 text

ιʔείʔυ h"ps:/ /github.com/yoching/CoordinatorSample 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

Coordinatorͷ࡞੒୯Ґ • ʮதʹෳ਺ͷVCΛ࣋ͭVCʯ୯ҐͰCoordinatorΛ࡞Δͱ෼͔Γ ΍͍͢ • UINaviga0onController • UITabBarController • containerViewΛར༻͍ͯ͠ΔViewController • UXతͳ෼ׂͱ΋Ұக͢Δ͸ͣ 7

Slide 8

Slide 8 text

Coordinator protocol protocol Coordinator { var presenter: UIViewController { get } func start() } 8

Slide 9

Slide 9 text

Naviga&onCoordinator protocol protocol NavigationCoordinator: Coordinator { var navigationController: UINavigationController { get } } extension NavigationCoordinator { var presenter: UIViewController { return navigationController as UIViewController } } 9

Slide 10

Slide 10 text

TabBarCoordinator protocol protocol TabBarCoordinator: Coordinator { var tabBarController: UITabBarController { get } } extension TabBarCoordinator { var presenter: UIViewController { return tabBarController as UIViewController } } 10

Slide 11

Slide 11 text

AppCoordinator final class AppCoordinator { private let window: UIWindow private let rootCoordinator: Coordinator init(window: UIWindow, rootCoordinator: Coordinator) { self.window = window self.rootCoordinator = rootCoordinator } func start() { rootCoordinator.start() window.rootViewController = rootCoordinator.presenter window.makeKeyAndVisible() } } 11

Slide 12

Slide 12 text

MainTabCoordinator final class MainTabCoordinator: TabBarCoordinator { let tabBarController: UITabBarController private let childCoordinators: [Coordinator] init(presenter: UITabBarController, childCoordinators: [Coordinator]) { self.tabBarController = presenter self.childCoordinators = childCoordinators } func start() { childCoordinators.forEach { coordinator in coordinator.start() } tabBarController.setViewControllers( childCoordinators.map { $0.presenter }, animated: false ) } } 12

Slide 13

Slide 13 text

2ͭͷNaviga'onͰڞ௨͢ΔભҠ͕͋Δ • ભҠ ɹ→ protocol-orientedʹղܾ 13

Slide 14

Slide 14 text

DetailsPresentable protocol protocol DetailsPresentable { func showItemDetail(item: Item) func showUserDetail(user: User) } 14

Slide 15

Slide 15 text

DetailsPresentable extension extension DetailsPresentable where Self: NavigationCoordinator { func showItemDetail(item: Item) { let itemDetailVC = StoryboardScene.ItemDetailViewController.initialViewController() itemDetailVC.item = item itemDetailVC.userTapped = showUserDetail navigationController.pushViewController(itemDetailVC, animated: true) } func showUserDetail(user: User) { // ... } } ※ VC→Coordinatorͷ௨৴͸ɺclosureΛհ͢ / delegate / Observable(FRP) ͳͲ 15

Slide 16

Slide 16 text

FeedCoordinator final class FeedCoordinator: NavigationCoordinator, DetailsPresentable { let navigationController: UINavigationController init(presenter: UINavigationController) { self.navigationController = presenter presenter.title = "Feed" } func start() { let feedViewController = StoryboardScene.FeedViewController.initialViewController() feedViewController.itemSelected = showItemDetail navigationController.pushViewController(feedViewController, animated: false) } } 16

Slide 17

Slide 17 text

Summary • Coordinatorͷ࡞੒ྫͷ঺հ • h+ps:/ /github.com/yoching/CoordinatorSample • Ͳ͏෼ׂ͢Δ͔ • ڞ௨ॲཧΛprotocol-orientedʹղܾ͢Δ 17

Slide 18

Slide 18 text

Thank you! 18

Slide 19

Slide 19 text

ࢀߟ • ը໘ભҠͷ؅ཧͱMVVM • Presen)ng Coordinators by Soroush Khanlou, NSSpain(2015) • Boundaries in Prac)ce by Nonaka Ayaka, try!SwiH(2016) • MVVM-C In Prac)ce by Steve ScoM, UIKonf(2016) • Connec)ng View Controllers at SwiH Talk(objc.io), 2016 19