도서 '꼼꼼한 재은 씨의 스위프트: 기본편'을 공부하면서 정리한 내용입니다.
전체 목록은 여기에서 볼 수 있습니다.

iOS의 화면 전환 방식

  • 소스 코드에서 구현하는 방식
    • 프로그래밍 방식
    • 동적 화면 전환
  • 스토리보드에서 구현하는 방식
    • GUI 방식
    • 정적 화면 전환

iOS에서의 화면 전환 개념


  1. 뷰 컨트롤러의 뷰 위에 다른 뷰를 가져와 바꿔치기하기 (특수한 케이스)
  2. 뷰 컨트롤러에서 다른 뷰 컨트롤러를 호출하여 화면 전환하기
  3. 내비게이션 컨드롤러를 사용하여 화면 전환하기
  4. 화면 전환용 객체 Segueway를 사용하여 화면 전환하기

1번은 뷰 컨트롤러와 무관하게 뷰 객체만 교체하여 화면전환하는 방식인 반면 2번 부터 4번은 뷰 컨트롤러를 호출하여 기존의 화면 위에 덮어서 화면을 전환하는 방식이다.

iOS에서 화면 전환의 특성

  • 다음 화면으로 이동하는 방법과 이전 화면으로 되돌아가는 방법이 다름
  • 화면 전환 방식에 따라 이전 화면으로 되돌아가는 방법이 다름

화면 전환 기법1 : 뷰를 이용한 화면 전환


  • 하나의 뷰 컨트롤러 안에 두 개의 루트 뷰를 준비한 다음, 상태에 따라 뷰를 적절히 교체
  • MVC 패턴에 위배 되는 방식(하나의 뷰컨 안에 두개의 루트 뷰)이므로 좋은 방법이 아님
  • 두개의 뷰 컨트롤러 안에 각각 루트 뷰를 준비한 다음, 하나의 뷰 컨트롤러에서 두개의 루트 뷰를 처리하는 방식도 있지만 이것도 좋은 방법이 아님

화면 전환 기법2 : 뷰 컨트롤러 직접 호출에 의한 화면 전환


  • 현재의 뷰 컨트롤러에서 이동할 대상 뷰 컨트롤러를 직접 호출해서 화면을 표시하는 방법
  • 프레젠테이션 방식이라고 부르기도 함
  • 사용 방법 : 화면을 표시하는 모든 뷰 컨트롤러는 UIViewController 클래스를 상속받는데, 이 클래스에서 정의된 다음 메소드를 사용화면 화면을 전화할 수 있음
    present(<새로운 뷰컨트롤러 인스턴스>, animated:<애니메이션 여부(bool 타입)>)    
    //present method
  • 화면 전환이 완료되는 시점에 맞추어 특정 로직을 실행해 주어야 할 경우
    present(<새로운 뷰컨트롤러 인스턴스>, animated:<애니메이션 여부(bool타입)>, completion:<실행할 로직(클로져 또는 함수 타입)>)
    위의 기본형에 이어서 쓰는 것과는 다르다. 왜냐하면 프레젠트 메소드는 비동기 방식으로 하나의 처리가 끝나기를 기다리지 않고 다음 작업을 바로 이어서 수행하는 메소드이기 때문.
  • 프레젠트 메소드를 이용한 화면 전환은 기존의 뷰 컨트롤러를 그대로 둔채, 그 위에 새로운 뷰 컨트롤러의 화면을 덮는 방식

ZnJvbT1jc2RuJnVybD16UXpNMElETTFVVE0zSWpNeE1UTXdJekwwVm1idTRHWnpObUxuOUdiaTV5WnRsMkx2b0RjMFJIYQ.jpg
화면 전환과 뷰 컨트롤러 참조 관계
VC1에서는 presentedViewController 속성을 이용하여 VC2를 참조할 수 있고, VC2에서는 presentingViewController 속성을 이용하여 VC1을 참조할 수 있다.

  • 이전 화면으로 복귀할 때 사용하는 복귀 메소드
    dismiss(animated:)    // 이전 뷰 컨트롤러의 인스턴스를 인자값으로 받지 않는다
  • 이전 화면으로의 복귀가 완료되는 시점에 특정 로직 실행하는 메소드
    dismiss(animated:completion:)
  • 복귀 메소드의 호출 주체는 VC2가 아니라 VC1 즉,
    self.dismiss(animated:) //(x)
    self.presentingViewController?.dismiss(animated:) //(o)