[UIkit]UINavigationController

choe_ju·2024년 1월 2일

📖 UINavigationController란?

  • 계층적 콘텐츠를 탐색하기 위한 스택 기반 구성표를 정의하는 컨테이너 뷰 컨트롤러이며 특징들은 아래와 같습니다.

📎 UINavigationController 특징

  • View Controller 관리: UINavigationController는 여러 개의 UIViewControllerNavigation stack으로 관리합니다
    • 새로운 View Controller를 스택에 추가(push)하면, 현재 화면에는 최상위 View Controller가 표시되게 됩니다
    • back(이전) 버튼, 왼쪽에서 우로 스와이프 하거나 **.popViewController메서드를 통해** pop하고 이후 최상단 view를 표시합니다.
// Push
func pushView() {
	 // 다음 들어갈 View 입력
   let nextView = nextViewController()
   self.navigationController?.pushViewController(nextView, animated: true)
 }

// Pop
func popView() {
   self.navigationController?.popViewController(animated: true)
}

  • Navigation Bar, Navigation Item: 최상위 View Controller에 따라 Navigation Bar의 내용이 동적으로 변경됩니다.

    • Navigation Bar에는 왼쪽(Back), 중앙(Title), 오른쪽(Button 등) 항목이 표시
  • 주의할점

    • 불필요한 Navigation Stack이 쌓이지 않도록 해줘야함 - 반복적으로 열 수 있는 구조 x
    • rootViewController 필수
  • UINavigationController

    • rootViewController 지정 필요
    • popToRootViewController : 모든 스텍 지우고 루트뷰로 이동
    // SceneDelegate 부분
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            //UINavigationController를 Base로 갖는 Scene 생성
            guard let windowScene = (scene as? UIWindowScene) else { return }
            window = UIWindow(windowScene: windowScene)
            window?.backgroundColor = .systemBackground
    				// window의 rootViewController 지정 
            window?.rootViewController = UINavigationController(rootViewController: ViewController())
    				// key로 만드는 이유?? -> 윈도우 자체를 키로 설정하고 - 메인 윈도우로 지정
            window?.makeKeyAndVisible()
    }
  • 위 코드는 Scene Delegate에서 앱이 시작될 때 초기화되는 윈도우와 루트 뷰 컨트롤러를 설정하는 부분입니다. `UINavigationController`를 루트로 설정하는 이유는 일반적으로 앱의 탐색 구조를 담당하며, 초기 화면을 `ViewController()`로 설정하여 화면에 표시합니다. 이러한 초기화 코드를 통해 앱이 실행될 때 적절한 화면 구조와 초기 화면이 구성될 수 있도록 합니다.


📎 Push ( NavigationController ) vs Present ( ViewController )

  • UIkit에서 다른 뷰를 띄워주는 방법은 대표적으로 위의 두가지가 있습니다. 위 두가지에 대해 차이점을 알아보고 상황별 사용 용도를 알아보겠습니다.
// 각각 뷰 컨트롤 방식
// present (View Controller)
@objc func showPresent() {
    let nextViewController = NextViewController()
    self.present(nextViewController, animated: true)
}
// push (Navigation Controller)
@objc func showPush() {
    let nextViewController = NextViewController()
    // viewController에 추가하고 navigation bar 해당 view에 맞게 바꿔줌
    navigationController?.pushViewController(nextViewController, animated: true)
}

// 각각 뷰 종료 방식
// present (View Controller)
func dismissViewController() {
	self.dismiss(animated: true)
}
    
// Navigation Controller
func popViewController() {
	self.navigationController?.popViewController(animated: true)
}

// 출력 뷰
class NextViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemGray3
    }
}
  • 위의 사진을 보면 중간의 Back버튼이 있는 뷰가 push(Navigation Controller)로 나타낸 view이고, 모달뷰로 나타난 부분이 present (View Controller)로 나타낸 view입니다.
  • 위의 코드를 보아 특성적으로 차이를 비교해보면 push(Navigation Controller)경우 stack에 쌓이며 순차적으로 view 출력이 이루어지고, present (View Controller)경우 단순 출력으로 차이를 비교할 수 있습니다.
  • 이러한 특성을 보아 사용 용도를 비교해보자면 Navigation의 경우 앞뒤 view를 서로 많이 이동하며 사용하는 부분이나, 단계적으로 절차가 필요한 경우에 주로 사용하고, 이와 다르게 present의 경우에는 단계적이지 않고 하나의 view만 보여주기에 팝업성으로 간단하게 표현하거나, 단순한 작업이 들어간 경우 주로 사용한다고 볼 수 있습니다.

→ NavigationController -순차적으로 작업이 필요한 부분에서 

→ present - 단순 표시 (팝업성)

0개의 댓글