티스토리 뷰
프로젝트를 진행하면서 연속적으로 쌓은 뷰를 제거해야하는 상황이 있었어요!
대기방에서 홈으로 가야했었지요.
스플래쉬 > 홈(MainTBC) > 코드입력팝업(CodeJoinVC) > 참여방 확인 뷰(JoinCheckVC) > 대기방
구조이고, 우리는
presentingViewController?.presentingViewController?.dismiss
이렇게 사용해서 코드로JoinCheckVC
를 닫고,CodeJoinVC
를 닫으려고 했어요! 하지만 그렇지를 못했져 이유를 알아봅시다..
먼저 dismiss(_:)
메서드에 대해서 알아봅시다.
👾 dismiss(animated:completion:)
Dismisses the view controller that was presented modally by the view controller.
📌 Parameters
- falg
transition 에 애니메이션을 적용하려면 true 를 전달해야한다.
- completion
뷰 컨트롤러가 dismiss 된 후 실행할 블록이다.
📌 Discussion
presenting view controller
는 자신이 present 한 뷰컨트롤러를 닫을 책임이 있습니다. presented view controller
자체에서 이 메서드를 호출하면 UIKit 는 presenting view controller
에게 해제를 처리하도록 요청합니다.
여러 뷰컨트롤러를 연속적으로 present 해서 presented view controller
스택을 구축하는 경우, 스택의 낮은 뷰컨트롤러에서 이 메서드를 호출하면 바로 자식 뷰컨트롤러와 위의 모든 뷰컨트롤러가 해제됩니다.
이런일이 발생하면, 맨위의 뷰만 애니메이션 방식으로 닫힙니다. 중간 뷰컨트롤러는 스택에서 간단히 제거됩니다. 맨위의 뷰는 modal transition stlye 을 사용하여 dismiss 됩니다. 이 스타일은 스택의 다른 하위 뷰컨트롤러에서 사용하는 것과 다를 수 있다.
만약 presented view controller
에 대한 참조를 유지하려면 이 메서드를 호출하기 전에 presentedViewController
속성의 값을 가져와야 합니다.
completion
핸들러는 presented view controller
에서 viewDidDisappear(_:)
메서드 호출된 다음에 호출됩니다.
이렇다고 하네요! 먼저 문제점! .dismiss
를 해당 뷰컨을 해제하는 메서드로 저는 잘못알고 쓰고 있었어요... ㅜ
화면을 dismiss
로 걷어내는 객체는 해당 뷰컨이 아니라는 거죠! 예를들어서, VC1이 VC2를 불렀다고 가정한다면, VC2가 화면에서 해제되기 위해서는 VC1가 해제시켜줘야하는 거에요.
어라..? 그러면 self.dismiss
가 아니라 self.presentingViewController.dismiss
를 써야하는거 아닌가요?
에 대한 답변으로 사용자의 관점에서 전혀 차이를 느낄 수 없다고 해요.
이 두 함수의 차이는 completion 함수 구현 시 발생한다고 해요!
dissmiss를 한 이후에 결과를 presentingViewController에게 알려주느냐 아니면 사라진 ViewController(self)에게 알려주느냐의 차이가 있다라고 하네요!
그래서 다시 프로젝트로 돌아가보자구여
스플래쉬 > 홈(MainTBC) > 코드입력팝업(CodeJoinVC) > 참여방 확인 뷰(JoinCheckVC) > 대기방
대기방에서 홈으로 가려면 CodeJoinVC
와 JoinCheckVC
를 해제해야하고, 그래서 MainTBC
에서 해제를 요청하면 상위 뷰컨들을 해제할 수 있어요!
결국 presentingViewController?. presentingViewController?. presentingViewController
에서 dismiss
를 호출해주어야 하는 것이지요!
출처:
'iOS' 카테고리의 다른 글
Swift) self 와 Self (0) | 2022.02.23 |
---|---|
iOS) 스와이프로 pop 하기(+추가) - enable back swipe gesture (0) | 2022.02.02 |
iOS) 옵셔널 타입 Any 로 업캐스팅 (0) | 2022.01.26 |
iOS) iOS 언어 설정 (0) | 2022.01.26 |
iOS) NVActivityIndicatorView 라이브러리 사용해보기 (0) | 2022.01.01 |
- WWDC
- configurable widget
- CloneCoding
- APNS
- MVVM
- SwiftUI
- 서버통신
- Protocol
- UserDefaults
- Widget
- Objective-C
- WWDC22
- Notification
- 2022 KAKAO TECH INTERNSHIP
- MOYA
- containerBackground
- github
- rxswift
- async/await
- watchOS
- urlsession
- Algorithm
- projectsetting
- IOS
- OpenSourceLibrary
- WidgetKit
- Swift
- Firebase
- RxCocoa
- YPImagePicker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Total
- Today
- Yesterday