iOS 앱 개발에서 한 뷰 컨트롤러(View Controller)에서 다른 뷰 컨트롤러로 이동하려면 내비게이션 컨트롤러(Navigation Controller)를 사용해야 합니다. 내비게이션 컨트롤러는 뷰 간 이동이 발생할 때 뷰 컨트롤러들을 스택(Stack) 구조로 관리하며, 화면이 쌓이고 빠지는 순서를 자동으로 처리해 줍니다.
뷰 컨트롤러 간 화면 전환은 아래의 두 단계를 통해 손쉽게 구현할 수 있습니다.
1단계 - 대상 뷰 컨트롤러 객체 생성하기
let vc = self.storyboard?.instantiateViewController(withIdentifier: "VC2ViewController") as! VC2ViewController
이 단계에서는 이동하고자 하는 뷰 컨트롤러 타입의 객체를 스토리보드에서 생성하여 초기화합니다. 이때 withIdentifier에 전달하는 식별자 값은 반드시 두 번째 뷰 컨트롤러의 스토리보드 ID(Storyboard ID)와 동일해야 합니다. ID가 일치하지 않으면 런타임 오류가 발생하므로 주의하세요.
2단계 - 다른 뷰 컨트롤러로 이동하기
객체 생성이 완료되면 내비게이션 컨트롤러를 통해 실제 화면 전환을 수행합니다.
self.navigationController?.pushViewController(vc, animated: true)
위 코드는 새로운 뷰 컨트롤러를 내비게이션 스택에 푸시(push)하는 방식입니다. 푸시된 화면은 상단에 뒤로 가기 버튼이 자동으로 생성되어 사용자가 이전 화면으로 쉽게 돌아올 수 있습니다.
푸시(Push) 대신 프레젠트(Present) 방식 사용하기
내비게이션 스택에 쌓지 않고 모달(Modal) 형태로 화면을 띄우고 싶다면 present 메서드를 사용할 수 있습니다.
self.present(vc, animated: true, completion: nil)
두 방식의 차이는 다음과 같습니다.
- pushViewController: 내비게이션 스택에 화면을 쌓으며, 계층적 흐름(목록 → 상세 등)에 적합합니다.
- present: 스택과 무관하게 화면 위에 새 화면을 띄우며, 설정창이나 로그인 화면 등 독립적인 흐름에 적합합니다.
위 코드를 실제 기기나 시뮬레이터에서 실행하면 버튼을 눌렀을 때 두 번째 뷰 컨트롤러로 부드럽게 전환되는 것을 확인할 수 있습니다.