티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

 

https://zeddios.tistory.com/938

 

RIBs 시작하기 - Root 설정

안녕하세요 :) Zedd입니다. https://zeddios.tistory.com/937 RIBs란? 안녕하세요 :) Zedd입니다. 오늘은 RIBs에 대해서 공부해보려고 해요. 그동안 컨퍼런스/세미나에서..많이 들었었는데, 특히 민소네님에게! 본..

zeddios.tistory.com

에서 Root RIB을 만들었었잖아요~

 

 

오늘은 LoggedOut/LoggedIn RIB을 붙혀보겠습니다.

딱 저 트리까지는 튜토리얼 프로젝트랑 완전히 똑같을거에요!!!

 

그럼 LoggedOut/LoggedIn RIB을 만들어줍니다.

 

저는 스토리보드도 추가해줬어요.

지금은 버튼 하나만 넣을거긴 한데..나중에 이것저것 추가할거라 ㅎㅎ

 

 

어떻게 할거냐면

LoggedOut RIB의 view에는 버튼이 있어요!

그 버튼을 누르면 LoggedIn RIB으로 가고,

또 LoggedIn에도 버튼이 있는데, 그 버튼을 누르면 LoggedOut RIB으로 가는

아주..간단한...걸 만들건데 간단할지 모르겠네요..ㅎㅎ

 

일단 LoggedOut 스토리보드에 버튼을 추가해주고

 

버튼을 LoggedOut ViewController와 연결해줄게요.

IBAction도 만들어주겠습니다. 

그럼

 

이렇게 되네요. 아 지금 보니까 IBOutlet은 필요없을 것 같은데......암튼 알아서하셈

 

자 이제 빌드를 해봅시다!

당연히 아직 이렇게 나오겠죠? 

왜냐하면 우리가 Root RIB에서 LoggedOut RIB을 띄우게 작업을 아직 안했기 때문..

 

자..그럼 어떻게 해야할까요?

그래 입코딩 해보자...

일단 Root RIB에서 LoggedOut RIB을 만들어서?

그러니까 LoggedOut ViewController를 만들어서 Present해주면 되겠네!!!!!!!!!!!!

그렇죠!?

 

그럼 RootViewController에서 Present를 해주어야하니까 Present 메소드를 구현해줍시다. RootViewController에 바로 구현을 하는 것도 좋지만..이것도 프로토콜 메소드를 사용해야합니다.

 

~~ViewControllable프로토콜은

"라우터가 뷰 계층을 조작하기 위해 호출하는 메소드를 선언"하라고 되어있죠?

 

Present를 호출하면 뷰 계층이 바뀌겠죠...!?

그러니 Present메소드를 선언해줍니다.

 

어떤 ViewController를 띄워줄건지 받아야 RootViewController에서 띄워주겠죠? 

그래서 ViewControllable타입의 파라미터를 하나 만들어줍니다.

 

자 이제 빌드를 하면 에러가 납니다.

 

RootViewController가 RootViewControllable를 채택하고 있는데,

정의한 메소드를 정의해주지 않아서..에러가 나는거죠!?

present메소드를 구현해줍시다.

 

자...ViewControllable프로토콜은 프로퍼티로

 

uiviewController를 가지고 있습니다!

우리는 단순히 프로토콜 타입을 파라미터로 받았잖아요?

근데 UIViewController의 present메소드는 UIViewController타입을 받잖아요~

그래서 ViewControllable의 UIViewController타입의 프로퍼티인 uiviewController를 넣어주는 겁니다..!!

 

자..이제 실행해보면 여전히 Root RIB인것을 알 수 있습니다.

왜냐면 라우터를 구현을 안해줬거든요..!

 

 

RootRouter에 가서, LoggedOut RIB을 attach하는 로직을 구현해줍시다.

 

아 여기서 막히네...

 

자!!!!!!!

 

RootRouter가 이렇게 있네요.

일단 제가 이해한대로..차근차근 해볼게요 :D..

일단 빌더가 필요합니다.

그래서 

 

RootRouter의 TODO에 보면,

 

생성자는 child builder 프로토콜을 주입하여 children building을 허용합니다.

 

라고 되어있죠?

 

그러니까 우리가 만들건 LoggedOut이니까

LoggedOutBuilder를 주입하면 되겠죠? 

 

"child builder 프로토콜"은 LoggedOutBuildable이기때문에

이렇게 LoggedOutBuildable타입의 파라미터를 하나 추가해줍니다.

그리고 init앞에 있는 override도 지워주세요.

 

여기까지 잘 따라오셨나요!?

자 이제..숨 좀 돌릴겸..

잠깐 메소드를 알아봅시다.

 

Router클래스에는 

 

attachChild와 detachChild가 있습니다.

라우터가 수행하는 그 역할이죠.

 

우리가 지금 하고싶은건 Root RIB에 LoggedOut RIB을 "attach"시켜주고싶잖아요?

그래서 RooRouter의 어딘가에서

"attachChild"라는 메소드를 호출해줘야합니다.

 

그쵸!!!

이걸 수행하기에 적합한 메소드가 있는데 바로

Router클래스의

 

didLoad()입니다.

 

이 didLoad()는

 

라우터 로드가 완료되면 호출되고, 딱 한번만 호출된다고 해요.

child attach와 같은 one time setup logic을 수행하려면

서브클래스가 이 메소드를 override해야합니다.

기본 구현은 아무 것도 수행하지 않습니다.

 

오~~~그럼 우리의 RootRouter로 가서

didLoad()를 오버라이드 해줍시다.

 

이렇게요.

 

자..이제 여기서 attachChild를 호출하면 될 것 같아요!!!

 

근데 child로 Routing타입을 받네요.

우리는 child가 LoggedOut일거니까 LoggedOut의 Routing타입을 넣어야 할 것 같은 느낌이죠?

LoggedOutRouting은

 

LoggedOutInteractor.swift의 가장 위에 있습니다.

그리고 이 LoggedOutRouting타입이 어디에 쓰이냐면...

 

LoggedOutBuildable에서 쓰이고있네요!

그럼

 

1. LoggedOutBuildable의 build메소드를 호출

2. 리턴으로 LoggedOutRouting이 나옴

3. 그 리턴값을

여기에 넣음.

 

으로 착착 하면 되겠네요!!!!!

 

 

1. LoggedOutBuildable의 build메소드를 호출

자..아까 우리 init에 LoggedOutBuildable타입의 파라미터를 하나 넣어준거 기억하시나요!?

 

이렇게요!

이걸 didLoad에서 호출하려면 전역변수로 선언이 되어야 할 것 같아요.

 

이렇게 LoggedOutBuildable타입의 변수를 하나 만들고

init에서

 

초기화를 해줍니다.

꼭 super.init위에 해줘야겠죠!?!?

 

자 그럼 didLoad에서

 

build메소드를 호출하면 될 것 같은데..Listener에 뭘 넣어야하는지 모르겠네요.

 

LoggedOutListener타입을 넣어야 하는데!

 

Router가 가지고 있는 interactor를 넣으면 됩니다.

 

이렇게요.

 

그럼 ㅇㅔ러가 나죠.

 

RootInteractable이 LoggedOutListener를 conform하지 않았다는 에러인데요!

RootRouter.swift 맨 위에

 

RootInteractable 프로토콜이 정의되어 있습니다.

RootInteractable 프로토콜이 

 

LoggedOutListener를 conform하게 해주세요. 

그럼..!!

 

에러가 사라진 걸 볼 수 있습니다.

 

자..그럼 드디어

 

attachChild를 호출할 수 있게 됩니다.

그리고 이 attachChild만 하면 착 붙는게 아니라

 

Router가 가지고 있는 viewController에서 present메소드를 호출해줘야 하나봐요.

 

자 빌드하려고 하면...

 

RootBuilder에서 에러가 납니다.

아까 우리가 init에 

 

loggedOutBuilder파라미터를 추가해줬잖아요~

RootBuilder에서 요 init을 쓰고있는데, 파라미터가 없어서 나는 에러입니다.

 

그럼 LoggedOutBuildable타입을 넣어줘야 하겠네요.

LoggedOutBuildable은 프로토콜이기 때문에

LoggedOutBuildable를 conform하는 concrete타입을 찾아보면

LoggedOutBuilder가 있네요.

그럼

 

이렇게 해주면 되는데..

또 RootComponent가 LoggedOutDependency를 conform하고 있지 않다고

컴파일 에러가 나네요..

컴파일 에러의 연속..

이건 모르겠어서...튜토리얼 프로젝트 보면

 

단순히 이렇게 해줬더라구요.

그러면 일단 에러가 사라지게 됩니다.

 

 

자 그럼 드디어 빌드가 되는데요.

ㅇ ㅏ LoggedOutViewController에 backgroundColor..빼먹지 맙시다..

 

자 그러면

LoggedOutViewController가 Root에 잘 attach된 것을 볼 수 있는데,

아까 제가 storyboard에 추가해준 Button이 없는 것을 볼 수 있습니다.

LoggedOutViewController가 storyboard와 연결?되어있기때문에

storyboard를 사용해 초기화를 해주어야 합니다. 

 

저는 회사에서 쓰는 라이브러리를 그냥 썼습니다. 그래서 공개 ㄴㄴ하겠음

storyboard ViewController 초기화는 검색하면 많이 나옵니당.

 

그러면 드디어...

내가 너 볼라고......

저는 일단 저 pageSheet형태로 뜨는게 맘에 안들어서 fullScreen으로 띄워줄게요. 

 

이렇게 해주면

 

이렇게 아름답게...뜨게 됩니다. 

이렇게 글이 길어질 줄 몰랐어여ㅛ 진짜.......

 

아무튼 틀린 내용이 있다면 꼭 댓글 달아주세요!

 

반응형

'공부' 카테고리의 다른 글

Xcode 11.4 Beta Release Notes  (3) 2020.02.06
Simulator에 사진/동영상 넣는 법📱  (0) 2020.01.21
RIBs 시작하기 - Root 설정  (2) 2020.01.14
RIBs란?  (6) 2020.01.10
Metal이 뭔지 궁금해서 쓰는 글  (1) 2020.01.05