UIKit 공식문서: showing and hiding view controllers

jane·2021년 11월 1일
0

iOS

목록 보기
5/32

Overview

다양한 방식으로 뷰컨트롤러들을 보여주는 방식과
화면전환이 일어나는 사이 데이터를 전달하는 방식에 대해 소개하는 글이다.

앱의 인터페이스 뷰컨트롤러를 present하고 dismiss하면서 변한다. 모든 window에는 초기화면을 보여주는 root 뷰컨트롤러가 있다. 새로운 뷰컨트롤러는 window에 새로운 view들의 묶음을 install하면서 그 초기화면을 바꾼다.
만약 뷰컨트롤러가 더 이상 필요없다면, 뷰컨트롤러를 dismiss하며 그 뷰컨의 view들을 window에서 제거한다.

뷰컨트롤러를 present하는 세가지 방법

  • 스토리보드에서 설계
  • 현재의 맥락이 present 방식을 결정하도록 하기
  • 컨테이너 뷰컨트롤러에 뷰컨트롤러들을 넣기
  • UIViewController의 메서드들을 직접 호출

스토리보드에서 present 방식 설정

Segue 방식을 사용한다.

initial 뷰컨트롤러에서의 action(버튼 누름, 테이블 열 선택 등)메서드가 있는 아무 객체에서 시작해서 다른 뷰컨트롤러로 연결한다.

연결 방법

1.객체에서 Ctrl + 드래그하면서 present하고싶은 뷰컨트롤러에 끌어다 놓는다.
2.나오는 리스트에서 원하는 segue 방식을 선택한다.

+ 또한 segue identifier을 추가하여 segue를 커스텀하도록 런타임에 사용가능하다(나중에 알아보자.)

현재의 맥락이 present 방식을 결정하도록 하기

똑같은 뷰컨트롤러를 여러곳에서 사용시, 사용 맥락에 맞게 present 방식을 다르게 해야하는 문제가 생긴다.
예를 들어, 한곳에서는 네비게이션 컨트롤러 안에 넣고싶고, 다른 곳에서는 모달 방식으로 present하고싶을 수도 있다.

이때, 이 두 메서드중 하나를 사용하면, 현재의 맥락에 맞게 뷰컨트롤러를 present해준다.
show(_:sender:) showDetailViewController(_:sender:)

정확하게는 저 메서드들이 targetViewController(forAction:sender:) 를 불러와서 동일한 show메서드를 가지고 있는 parent 뷰컨트롤러를 찾는다. 찾으면 parent의 메서드를 불러와서 새로운 뷰컨트롤러를 네비게이션 스택에 집어넣는다. (부모가 UINavigationController인경우)

근데 만약 present 방식을 다루는 뷰컨트롤러가 하나도 없으면, UIKit는 이 새로운 뷰컨트롤러를 모달 방식으로 present한다.

@IBAction func showSecondViewController() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondVC = storyboard.instantiateViewController(identifier: "SecondViewController")

        show(secondVC, sender: self)
    }
profile
제가 나중에 다시 보려고 기록합니다 ✏️

0개의 댓글