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
- setRoot메서드 → { window.rootViewController = viewController, window.makeKeyAndVisible(), presented(from:window) }
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> }
- public func trigger(_ route: RouteType, with options: TransitionOptions){}
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 |