왕논의 연구실

[Swift] 자식 뷰컨트롤러에서 dismiss를 적용하면? 본문

iOS/Swift

[Swift] 자식 뷰컨트롤러에서 dismiss를 적용하면?

ywangnon 2023. 5. 31. 22:45

현재 회사 앱은 coordinator 패턴으로 만들어져 있습니다.

그러다보니 ViewController 안에 ViewController가 쌓이는 경우가 많습니다.

 

코디네이터 패턴에서 백버튼을 만드는데, 자식 ViewController에서 dismiss를 하니 부모 ViewController까지 dismiss 되었습니다.

 

처음 이 현상을 보았을 때는 이해가 되지 않았습니다. dismiss를 하면 dismiss한 VC와 그 위에 쌓인 VC들이 해제가 되어야하는데, 코드상 상위인 부모 VC가 해제된 걸로 보이니 말입니다.

 

생각해보면, 자식VC는 present된 것이 아니라 부모 VC의 요소로서 있는 것이므로 자식VC가 해제되기 위해선 부모 VC레벨에서 해제되는 것이 맞는 것처럼 생각됩니다.

 

그래서 이에 관해 찾아보았습니다.

 

일단 dismiss에 대한 정의입니다.

dismiss(animated:completion:) | Apple Developer Documentation

 

dismiss(animated:completion:) | Apple Developer Documentation

Dismisses the view controller that was presented modally by the view controller.

developer.apple.com

여기서 보면 '뷰 컨트롤러의 스택의 경우 하위 뷰 컨트롤러에서 호출하면, 바로 아래 자식 뷰 컨트롤러와 스택에서 해당 자식 위에 있는 모든 뷰 컨트롤러가 해제됩니다.' 라는 문구가 있습니다.

 

그러나 제가 궁금한 건 코드상 하위가 아닌 상위인 부모뷰 컨트롤러의 해제가 되는 이유입니다.

 

찾아보니 애플 포럼에 비슷한 질문이 있었습니다.

How to properly destroy a child UI… | Apple Developer Forums

 

How to properly destroy a child UI… | Apple Developer Forums

I have my mainController (parent) and my menuController (child). I call the menuController with addChild(child) view.addSubview(child.view) child.didMove(toParent: self) The child dismisses itself with: self.dismiss(animated: true, completion: nil) The que

developer.apple.com

 

이 질문은 저의 의도와는 약간 다르지만, 자식 뷰컨트롤러를 해제하는 방법에 대해 설명하고 있습니다.

 

일단 이 질문한 포럼에서 modal로 전달한 것에 사용해야한다는 설명이 있습니다. 이로보아 추측한 것이 대충 맞는 것 같긴합니다. 많이 찾아보았지만, 사실 이런 식으로 짜는 사람도 별로 없으니 질문도 별로 없는 것 같습니다.

 

대부분 자식뷰 컨트롤러에서 dismiss해서 없애면 안되냐는 질문과 그에 대한 답이고, 왜 부모뷰까지 dismiss되는지에 대한 설명은 없습니다.

 

그리고 찾아보니 이 패턴이 present와 dismiss를 하는 방법이 따로 있는 것 같습니다.

Design Pattern - Coordinator Part1 (tistory.com)

 

Design Pattern - Coordinator Part1

Coordinator Pattern Coordinator Pattern은 Structure Design Pattern으로 View Controller간의 로직 흐름을 조직하기 위한 디자인 패턴이다. 간단하게 얘기하자면, 뷰간 화면 전환 Coordinator로 한번에 관리하겠다는 뜻

doing-programming.tistory.com

라우터 프로토콜에서 담당하는데 정확히 모르겠네요.

 

일단 '모달'과 'coordinator 패턴'을 나중 과제로 두고 이쯤에서 결론을 지어야 할 것 같습니다.

 

dismiss는 present된 것에 사용하는 것이 올바른 사용방법이다!

 

※ 자식 뷰컨트롤러에서 dismiss하는 테스트 소스

DismissTest.zip
0.04MB

'iOS > Swift' 카테고리의 다른 글

[Swift] Size Class  (0) 2023.01.16
[Swift] 기기에 따른 화면 오토레이아웃 구성  (0) 2023.01.15
[Swift] CoreBluetooth  (0) 2022.11.30
[swift] lazy  (0) 2022.06.30
[Swift] UIToolbar  (0) 2022.06.29