[Swift] - Xcoordinator 정리해보자

2024. 3. 15. 09:56·개발일기/IOS

Presentable

public protocol Presentable

  • var viewController : UIViewController! { get }
    • 뷰 컨트롤러 객체
  • func router<R: Route>(for route: R) → StrongRouter<R>?
    • Route타입 인자(어디화면으로 갈건지 정보)를 받아서 StrongRouter<인자>를 return
  • func presented(from presentable: Presentable?)
    • Presentable객체를 인자로 받음, 띄워주는 것 같다.
  • func registerParent(_ presentable: Presentable & AnyObject)
    • Prsentable프로토콜을 따르는 객체이면서 동시에 클래스 타입인 객체를 인자로 받는다
    • 부모를 등록하는 것 같다
  • func childTransitionCompleted()
    • 자식으로의 전환을 완료되었다는 것 같음
  • func setRoot(for window: UIWindow)
    • UIWindow객체를 인자로 받아서 루트뷰를 등록하는 것 같음
  • extension Presentable
    • setRoot메서드 → { window.rootViewController = viewController, window.makeKeyAndVisible(), presented(from:window) }
      • 인자로 받은 윈도우 객체의 루트 뷰 컨트롤러를 등록하고, 키 윈도우로 만들고 화면에 표시하고, presented메서드 실행?
    • router메서드 → { self as? StrongRouter<R> }
      • Presentable프로토콜을 채택하고 있는 자기 자신을 StrongRouter<자기자신>해서 return

Router

public protocol Router: Presentable

  • associateType RouteType: Route
    • Route프로토콜을 채택하는 제네릭 타입
  • func contextTrigger(_ route: RouteType, with options: TransitionOptions, completion: ContextPresentationHandler?)
    • public typealias ContextPresentationHandler = (TransitionContext) -> Void
    • Route프로토콜을 채택하는 제네릭타입과 트랜지션옵션, 컴플레션핸들러를 인자로 받는다
  • extension Router
    • public func trigger(_ route: RouteType, with options: TransitionOptions){}
      • Route프로토콜을 채택하는 제네릭타입과 트랜지션옵션을 인자로 받아서 세번 째 trigger함수로 completion은 nil로 해서 넘김
    • trigger(route, with:options, completion:nil)
    • public func trigger(_ route: RouteType, completion: PresentationHandler? = nil){}
      • PresentationHandler = () → Void
      • RouteType타입과 컴플레션을 받아서 with는 .default로 해서 넘김
    • trigger(route, with : .default, completion: completion)
    • public func triggeer(_ route: RouteType, with options: TransitionOptions, completion: PresentationHandler?){contextTrigger(route, with: options) { _ in completion?() }
      • 인자로 받은 것들을 contextTrigger함수에 넘김.
    • } }
    • autoreleaspool{
    • public var strongRouter: StroungRouter<RouteType>{ StrongRouter(self) }
    • public func router<R: Route>(for route:R) → StrongRouter<R>?
    • { strongRouter as? StrongRouter<R> }

StrongRouter

public final class StrongRouter<RouteType: Route> : Router

private let _contextTrigger: (RouteType, TransitionOptions, ContextPresentationHandler?) -> Void

private let _trigger: (RouteType, TransitionOptions, PresentationHandler?) -> Void

private let _presented: (Presentable?) -> Void

private let _viewController: () -> UIViewController?

private let _setRoot: (UIWindow) -> Void

private let _registerParent: (Presentable & AnyObject) -> Void

private let _childTransitionCompleted: () -> Void

—> 모두 Presentalble에 있는 것들을 init할 때 대입하고, 언더바 없는 이름으로 함수 만들어서 위에 프로퍼티들을 실행한다.


NavigationCoordinator<Routetype: Route> : BaseCoordinator<RouteType,NavigationTransition>

public let animationDelegate = NavigationAnimationDelegate()
// 네비게이션 애니메이션 대리자 선언

public var delegate: UINavigationControllerDelegate? {
    get {
        animationDelegate.delegate
    }
    set {
        animationDelegate.delegate = newValue
    }
}

public override init(rootViewController: RootViewController = .init(), initialRoute: RouteType? = nil) {
    if rootViewController.delegate == nil {
        rootViewController.delegate = animationDelegate
    }
    super.init(rootViewController: rootViewController, initialRoute: initialRoute)
    animationDelegate.presentable = self
}

public init(rootViewController: RootViewController = .init(), root: Presentable) {
    if rootViewController.delegate == nil {
        rootViewController.delegate = animationDelegate
    }
    super.init(rootViewController: rootViewController, initialTransition: .push(root))
    animationDelegate.presentable = self
}
728x90
저작자표시 변경금지 (새창열림)

'개발일기 > IOS' 카테고리의 다른 글

[Swift] - CollectionView 정리  (0) 2024.03.15
[Swift] - ViewController 화면전환  (0) 2024.03.15
[Swift] - ViewController 생명주기  (0) 2024.03.15
[Swift] - IOS 앱 생명주기  (0) 2024.03.15
[Swift] - View와 Layer 관계  (0) 2024.03.15
'개발일기/IOS' 카테고리의 다른 글
  • [Swift] - ViewController 화면전환
  • [Swift] - ViewController 생명주기
  • [Swift] - IOS 앱 생명주기
  • [Swift] - View와 Layer 관계
코딩하는빵친자
코딩하는빵친자
안녕하세요 코딩하는 빵친자입니다. 말그대롭니다.
  • 코딩하는빵친자
    코딩하는 빵친자의 블로그
    코딩하는빵친자
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 개발일기 (41)
        • Python (9)
        • Swift (2)
        • DataBase (0)
        • 알고리즘 (0)
        • IOS (30)
      • 데보션 영 (4)
      • 코테 (10)
        • Swift (10)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Rosetta
    podlock
    ios스와이프
    아웃링크
    arm7
    추적권한
    제스처인식
    universalapp
    xcode
    uikit
    ios개발
    pod
    settransition
    uipangesture
    SWIFT
    podinstall오류
    뷰관련메서드
    IOS
    buildsetting
    delegate패턴
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩하는빵친자
[Swift] - Xcoordinator 정리해보자
상단으로

티스토리툴바