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 메소드를 써야하는 것도 아니다.
하지만 기본적으로 화면 전환의 구조는 이처럼 짜여져 있기 때문에 해당 구조를 반드시 이해하고 사용하는 것이 좋을 것 같다.