본문 바로가기

ios

[iOS] present VS addChild, dismiss

요약

present : 뷰컨트롤러 위에 뷰컨트롤러를 덮어씌워 표시할 때

addChild : 뷰컨트롤러 하위에 뷰컨트롤러를 추가할 때

 

Present

present(<새로운 뷰 컨트롤러 인스턴스>, animated: <애니메이션 여부(Bool)>)
present(<새로운 뷰 컨트롤러 인스턴스>, completion: <화면 전환 완료때 실행될 메소드>)

 

  • UIViewController의 present 함수를 사용한다.
  • 기존 UIViewController위에 새로운 UIViewController를 덮어 씌운다.
  • 기존 UIViewController와 새로운 UIViewController는 상호 참조 관계가 성립된다.
    • 직접 참조하거나 delegate를 통해 간접 참조할 수 있다.
    • 화면(UIViewController)이 전환된 이후에도 이전 화면에 대한 참조가 필요한 경우가 많다.
    • 예를 들어, 이전 화면으로 되돌아가야하는 경우가 있다.
    • 화면 이동할 때 화면을 계속 쌓는 형태이기 때문에, 이전 화면으로 돌아갈 때는 화면을 걷어내는 방식의 메소드를 사용해야한다.

 

UIViewController의 인스턴스 생성하기

 

스토리 보드

1. 다음 UIViewController와 이전 UIViewController가 같은 스토리 보드파일에 있는 경우

let nextScene = self.storyboard!.instantiateViewController(Identifier: "AfterViewController"

 

2.다음 UIViewController와 이전 UIViewController가 다른 스토리 보드파일에 있는 경우

let storyboard = UIStoryboard(name : "<스토리보드 파일명>", bundle: Bundle.main)
let afterVC = storyboard.instantiateViewController(identifier: "AfterViewController")
self.present(afterVC, animated: true, completion: nil)

 

XIB

let myVC = MyViewController(nibName: "MyViewController", bundle: nil)
        myVC.modalPresentationStyle = .fullScreen // 원하는 스타일 설정 가능
        present(myVC, animated: true, completion: nil)

 

 

Dismiss

 

 

 

  • 주의
    • 일반적으로 VC에서 dismiss를 호출하면 VC가 자기자신을 dismiss하는 것이라 오해한다.
    • presenting VC가 presented VC를 dismiss 시키는 동작이다.
      • 기존에 있던 아래 VC가  위의 VC를 dismiss 시키는 동작이다.
    • dismiss()를 호출한 VC가 presentedVC가 없으면 자신의 presenting VC에게 자신을 dismiss처리하도록 전달한다.
    • modal stack이 여러개 쌓였을 때 중간의 VC를 없애려면 중간 VC의 presentingViewController를 사용해서 dismiss 해야한다.
    • 예를 들어 현재 보이는 화면은 modal-depth3 이지만 modal-depth2와 modal-depth3도 없애고 싶다면 modal-depth3.presentingViewController?.presentingViewController?.dismiss(animated: true) 

 

 

AddChild

  • ViewController 안에 ViewController를 추가할 때 사용
  • 4가지 메서드 필요
    • addChild(_:)
    • removeFromParent()
    • willMove(toParent:)
    • didMove(toParent:)
parentVC.addChild(childVC)
parentVC.view.addSubView(childVC)
childVC.willMove(toParent: parent)
childVC.didMove(toParent: parent)

 

addChild()

  • ViewController 간에 parent-child 관계를 만들기 위해서 필수적으로 사용되는 함수
  • 같은 childVC를 서로 다른 parentVC에 동시에 적용할 수 없음
  • 한 praentVC는 여러 childVC를 가질 수 있음

willMove()

  • childVC가 parentVC에 추가되고 지워지기 전에 호출된다.

didMove()

  • childVC가 parentVC에 추가되고 지워진 후에 호출된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

참조한 출처

https://infinitt.tistory.com/332

 

(iOS) 화면 전환 방식 (present, pushViewController, Segue)

iOS의 화면 전환 방식 IOS의 화면 전환 방식은 크게2가지로 나뉜다. 1. 소스코드에서 구현 - "프로그래밍적으로 화면 전환한다" or "동적으로 화면 전환한다." 2. 스토리보드에서 구현 - "GUI 방식으로

infinitt.tistory.com

https://jinsangjin.tistory.com/119

 

swift - viewController에 viewController 추가하기 #addChild()

UIView와 같은 경우 ViewController 하위에 포함시키고자 할때 객체를 생성해서 addSubView 해주면 됩니다. 그런데 ViewController를 ViewController 안에 추가하고 싶은 경우는 어떻게 할까요? 공식 문서를 보면

jinsangjin.tistory.com

https://showcove.medium.com/ios-navigation-vs-modal-2-2f780fad84c0

 

iOS : Navigation vs Modal (2)

Modal Present & Dismiss

showcove.medium.com

https://eastjohntech.blogspot.com/2020/01/dismiss.html

 

dismiss에 대해서 알아봅시다

dismiss에 대해서 알아봅시다 예전에는 dismiss를 호출하면 호출한 viewController가 dismiss된다고 생각했습니다. 그런데 어떤 경우는 자신이 dismiss되는게 아니라 자신이 present한...

eastjohntech.blogspot.com