모달(present/dismiss)과 네비게이션(push/pop)은 iOS 앱에서 화면 전환을 관리하는 주요 방법입니다. Apple의 Human Interface Guidelines (HIG)에 따르면, 각각의 방식은 다음과 같은 상황에서 사용됩니다.
: 모달은 새로운 뷰를 현재 뷰 위에 겹쳐서 표시하는 방식입니다. 모달 형태로 표시된 뷰는 사용자의 작업이 완료되기 전까지 이전 뷰와 상호작용할 수 없습니다. 일반적으로 모달이 닫히면 해당 뷰는 메모리에서 해제됩니다.
A라는 뷰 위에 B라는 뷰를 정의함. 한 겹씩 올리는 구조
[ HIG에서 정의하는 모달이 적합한 상황 ]
1. 갑작스럽게 사용자의 흐름을 방해하는 알림, 경고 메시지 등을 표시할 때 적합합니다.
2. 사용자가 반드시 처리해야 하는 중요한 작업을 요구할 때 사용합니다.
present (_:animated:completion:)
func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil)
dismiss (animated:completion:) ➡️ 현재 모달로 표시된 뷰를 닫고 이전 화면으로 돌아갑니다.
func dismiss(animated: Bool, completion: (() -> Void)? = nil)
: 네비게이션은 뷰 컨트롤러 스택에 새로운 뷰 컨트롤러를 추가하거나 제거하여 화면 전환을 관리하는 방식입니다. 이 스택 구조는 사용자가 뒤로가기 버튼을 통해 이전 화면으로 쉽게 돌아갈 수 있도록 합니다.
A뷰에서 B뷰로 이어지는 구조. B뷰에서 뒤로가기를 눌렀을 때 A뷰로 돌아갈 수 있는 구조.
[ HIG에서 정의하는 네비게이션이 적합한 상황 ]
1. 특정 작업의 순서가 중요하고, 사용자가 단계를 따라 진행해야 할 때 사용합니다.(회원가입 프로세스, 등록 단계, 설정 메뉴 탐색 등)
2. 화면 간의 계층 구조가 있고, 사용자가 이전 화면으로 쉽게 돌아갈 수 있도록 합니다.
pushViewController(_:animated:) ➡️ 가로로 뷰 전개가 이루어지는 것.
popViewController(animated:) ➡️ 스택에서 최상위 뷰 컨트롤러를 제거하고 이전 화면으로 돌아갑니다.(present의 dismiss와 같은일을함.)