-
[iOS] Child RIBs를 추가해보자👻 iOS 2020. 12. 29. 23:37
2020/12/29 - [👻 iOS] - [iOS] CocoaPods 으로 RIBs 프로젝트 셋팅하기
이전에 셋팅과정을 참고해 주세요
1. 자식 RIBs 템플릿 추가
LoggedOut 그룹을 만들어서 RIBs 템플릿을 이용해 필요한 파일들을 만들어 줍니다. 뷰가 필요한 RIB 이니까 'Owns corresponding view' 옵션을 체크해서 생성해 줍니다.
2. RootRouter에 LoggedOut 추가
Root에 추가되는 Child이기 때문에 Router에 먼저 추가해 봅니다.
1. RootBuilder 에서 넘겨지는 LoggedOutBuildable 을 RootRouter 생성자에 추가하고
init(interactor: RootInteractable, viewController: RootViewControllable, loggedOutBuildable: LoggedOutBuilder) { self.loggedOutBuildable = loggedOutBuildable super.init(interactor: interactor, viewController: viewController) interactor.router = self }
2. loggedOutBuildable 을 private 변수로 저장해 둡니다.
private var loggedOutBuildable: LoggedOutBuilder
3. didLoad 하면 바로 attach 시켜줘야 하니까 임의로 attachLoggedOut 함수를 추가해 두고요. attachLoggedOut 함수를 구현합니다. 내부에는 buildable에 build 함수를 이용해 child RIB을 생성해요.
override func didLoad() { super.didLoad() self.attachLoggedOut() } private func attachLoggedOut() { let loggedOut = loggedOutBuildable.build(withListener: interactor) self.loggedOut = loggedOut attachChild(loggedOut) viewController.present(viewControllable: loggedOut.viewControllable) }
build 함수 실행시 interactor 를 넣으면 "Argument type 'RootInteractable' does not conform to expected type 'LoggedOutListener'" 오류가 발생합니다. 아래와 같이 RootInteractable 에 LoggedOutListener프로토콜을 상속 받아야 해요.
protocol RootInteractable: Interactable, LoggedOutListener { var router: RootRouting? { get set } var listener: RootListener? { get set } }
그리고 view를 present 시켜주는 'viewController.present(viewControllable: loggedOut.viewControllable)' 는 ViewControllable 에 프로토콜 정의를 해둡니다.
protocol RootViewControllable: ViewControllable { func present(viewControllable: ViewControllable) }
이렇게 하면 일단은(?) RootRouter 에 정의는 완료되어 보여요.
proprotocol oriented programming 이니까 빌드 한번 눌러주고 다음에 뭘 할지 살펴봅니다.
RootBuilder와 RootViewController 에 필요한 녀석들이 보이네요
Builder부터 고쳐봅니다.
3. RootBuilder 에 LoggedOut 추가
아까 RootRouter 생성자에 loggedOutBuildable 을 추가했으니 이제 넘겨줄 차례에요. LoggedOutBuilder 로 component 의존성을 추가해서 인스턴스를 만들어 넘깁니다. 이 때 component는 LoggedOutDependency 프로토콜에 호환되지 않는다는 오류가 발생합니다. RootComponent에 해당 프로토콜을 추가해 주면 간단히 해결.
final class RootComponent: Component<RootDependency>, LoggedOutDependency { } final class RootBuilder: Builder<RootDependency>, RootBuildable { override init(dependency: RootDependency) { super.init(dependency: dependency) } func build() -> LaunchRouting { let component = RootComponent(dependency: dependency) let viewController = RootViewController() let interactor = RootInteractor(presenter: viewController) let loggedOutBuildable = LoggedOutBuilder(dependency: component) return RootRouter(interactor: interactor, viewController: viewController, loggedOutBuildable: loggedOutBuildable) } }
4. RootViewController 에 present 구현
이제 남은건 present 시켜주는 건가.. 바로 구현해 줍니다. 그냥 모달로 띄워볼꺼니까 아래와 같이 넣어줍니다.
final class RootViewController: UIViewController, RootPresentable, RootViewControllable { weak var listener: RootPresentableListener? override func viewDidLoad() { self.view.backgroundColor = .yellow } func present(viewControllable: ViewControllable) { present(viewControllable.uiviewController, animated: true, completion: nil) } }
3. 잘 되나?
이제 대충 구현은 다 된거 같은데, LoggedOutViewController 에 아무것도 없으니 일단 배경색이나 추가해서 구분해 보겠습니다.
final class LoggedOutViewController: UIViewController, LoggedOutPresentable, LoggedOutViewControllable { weak var listener: LoggedOutPresentableListener? override func viewDidLoad() { self.view.backgroundColor = .green } }
오오.. 잘 되네요.
다음번엔 다른 RIB으로 전환하는 것을 해봐야겠네요
Git : github.com/maarteti/rib-test/releases/tag/loggedOut