1. 코드상에서의 전환

  • 코드상에서 화면을 전환하는 방법은 크게 present-dismiss 메소드를 이용하는 경우와 push-pop 메소드를 이용하는 경우로 나눌 수 있다.
  • 설명이 쉽도록 첫 뷰 인스턴스를 VC1 이라 칭하고 전환될 뷰 인스턴스를 VC2라 칭한다.

1-1. present 메소드 (화면 띄우기)

  • VC1.swift
@IBAction func moveNextPage(_ sender: UIButton) {
        guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "nextVC") else { return }
        present(nextVC, animated: true, completion: nil)
    }
  • VC1.swift에 @IBAction으로 연결된 버튼 메소드를 정의한다.
  • instantiateViewController는 인자값으로 스토리보드에서 만들어진 뷰 인스턴스의 identify(StorboardID)를 받기 때문에 스토리보드상에서 미리 설정해두는 작업이 필요하다. (위의 경우 VC2의 identify로 nextVC를 입력해두었다.)
  • 스토리보드상에서 이와 같은 작업이 안되어있는 경우 nil을 반환할 수 있도록 guard-let 구문을 통해 안전하게 바인딩한다.
  • 이렇게 만들어진 VC2 인스턴스는 VC1에서 present한다. 즉 VC1에서 VC2 인스턴스를 생성한 후, 화면에 띄우는 과정을 거친다.

1-2. dismiss 메소드 (화면 내리기)

  • VC2.swift
@IBAction func back(_ sender: UIButton) {
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }
  • 띄워진 화면을 내릴때에는 VC2 내부에 @IBAction으로 연결된 버튼 메소드를 정의한 후 dismiss 메소드를 사용한다.
  • presentingViewController는 해당 뷰 인스턴스를 띄운 뷰를 말한다. 즉 presentingViewController = VC1이 된다.
  • 구조가 조금 이해가 안될 수 있지만 VC2는 VC1에 의해 생성되었고 띄워졌기 때문에 사라지는 것도 스스로 할 수 없다.
  • 위의 코드가 VC2에 작성되긴 했지만 메소드의 의미 자체가 VC1에게 VC2가 사라지겠다는 의사를 전달하는 것과 같다.

1-3. push 메소드 (화면 띄우기)

  • push-pop 메소드를 쓰는 경우는 내비게이션 뷰 컨트롤러를 사용하는 경우를 전제조건으로 한다.

  • VC1.swift
    @IBAction func moveNextPage(_ sender: UIBarButtonItem) {
          guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "nextVC") else { return }
          self.navigationController?.pushViewController(nextVC, animated: true)
      }
    
  • 내비게이션 컨트롤러를 사용하는 경우에도 똑같이 guard-let 바인딩을 통해 안전하게 VC2를 생성한 후 present가 아닌 push 메소드를 통해 VC2를 띄운다.
  • push 메소드는 내비게이션 뷰 컨트롤러를 사용할 때 쓸 수 있는 메소드로 이렇게 해서 띄운 뷰 인스턴스는 내비게이션 뷰 컨트롤러의 지배구조에 들어가기 때문에 내비게이션바가 자동으로 생성된다.
  • 또한, push로 연결된 뷰 인스턴스는 특별한 조치를 취하지 않아도 자동으로 화면을 내릴 수 있는 Back버튼이 생긴다.

1-4. pop 메소드 (화면 내리기)

  • 앞서 말했듯 기본적으로 내비게이션 뷰 컨트롤러의 지배구조에 놓이게 된다면 자동으로 Back버튼이 추가가 되지만 내비게이션바를 사용하지 않거나 커스텀하게 사용할 경우는 pop 메소드를 사용한다.
  • VC2.swift
@IBAction func back(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
    }
  • 자동으로 생성되는 Back버튼을 이용하지 않을 경우 이처럼 VC2에서 @IBAction으로 정의된 메소드에서 pop메소드를 실행하도록 하면 된다.

2. 스토리보드상에서의 전환

2-1. 세그웨이 사용 (화면 띄우기)

  • VC2를 띄울 트리거가 될 버튼을 마우스 우클릭 혹은 control+드래그를 통해 VC2에 연결한다.
  • 이때 action segue는 Present Modally로 연결한다.
  • 이렇게 하면 별다른 코드작성 없이도 화면을 띄울 수 있다.

2-2. Exit 사용 (화면 내리기)

  • Exit는 단순히 이전 화면으로 돌아가는 것이 아닌 현재 화면을 내린 후 띄워질 화면을 선택할 수 있다.
  • Exit를 사용할 때에는 현재 띄워진 VC2 뷰 인스턴스를 해제한 후 이동할 뷰 컨트롤러 내부에 함수를 작성해야 한다.
  • 이 경우에서는 VC1과 VC2 뿐이므로 VC2가 사라진 후 나타날 VC1 내에 함수를 작성한다.

  • VC1.swift
@IBAction func back(_ sender: UIStoryboardSegue) {
    }
  • 이처럼 VC2가 사라진 후 나타날 뷰 컨트롤러 내부에 다음고 같은 메소드를 정의하면 스토리보드상에서 Exit와 연결할 수 있게 된다.


  • 이처럼 화면 전환에는 다양한 방법이 있으며 스토리보드로 띄웠다고해서 반드시 Exit를 써야하는 것도 아니며 present 메소드를 썼다고 하여 반드시 dismiss 메소드를 써야하는 것도 아니다.
  • 하지만 기본적으로 화면 전환의 구조는 이처럼 짜여져 있기 때문에 해당 구조를 반드시 이해하고 사용하는 것이 좋을 것 같다.