ViewController을 navigation으로 띄우는 방식: push와 show

jane·2021년 10월 30일
1

iOS

목록 보기
2/32

storyboard segue를 이용하여 viewController을 띄울수도 있으나,
코드로도 똑같이 어떻게 동작하는지 알아보겠다.

1. pushViewController을 이용하는 방법

UINavigationController 가 container view controller 일때, 새로운 뷰 컨트롤러들을 현재의 네비게이션 stack에 push할 수 있다.

  • 네비게이션 방식
    a. 네비게이션 컨트롤러에 연결되어있는 현재 뷰컨트롤러에서 새로운 뷰컨트롤러를 가져올 수 있다.
    func presentStockModifyView() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let stockModifyVC = storyboard.instantiateViewController(identifier: "aa")
    
        navigationController?.pushViewController(stockModifyVC, animated: true) //deprecated 방식
    }

a-2. 참고) 같은 것을 모달 방식으로 하려면 present 메서드 이용

    func presentStockModifyView2() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let stockModifyVC = storyboard.instantiateViewController(identifier: "aa")
        present(stockModifyVC, animated: true, completion: nil)
    }

b. 네비게이션 컨트롤러에 연결되어있는 현재 뷰컨트롤러에서 새로운 네비게이션 컨트롤러는 네비게이션 방식으로는 가져올 수 없다. (에러남)

//에러
    func presentStockModifyView() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
        navigationController?.pushViewController(stockModifyNC, animated: true)
    }

b-2. 참고) 네비게이션 컨트롤러에 연결되어있는 현재 뷰컨트롤러에서 새로운 네비게이션 컨트롤러모달 방식으로 시도해보니 가져와진다...?

    func presentStockModifyView() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
        present(stockModifyNC, animated: true, completion: nil)
    }

2. show를 이용하는 방법

앱이 만약 아이폰이 아니라 아이패드처럼 더 큰 화면을 가진 기기에서 실행이 될때, UINavigationController가 아니라 UISplitViewController 같은 더 큰 화면을 관리하는 container view controller를 사용할수도 있다.

show 메서드를 사용하면, pushViewController 방식처럼 현재의 네비게이션 stack에 새로운 뷰 컨트롤러를 직접적으로 호출하는 것이 아니라, 시스템이 primary context를 기반으로 뷰 컨트롤러를 present 하는 것을 결정할 수 있도록 한다.

따라서, show 앞에 현재 뷰에 네비게이션 컨트롤러가 연결되어있는지 확인하는 navigationController?는 생략가능하다.

이 방법은 이전 방법보다 훨씬 dynamic하고 미래의 변동가능성을 대비한 좋은 방법이다.

    func presentStockModifyView() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
        navigationController?.show(stockModifyNC, sender: nil)
    }

궁금했던 점

네비게이션 컨트롤러 안의 뷰컨트롤러에서, 또 다른 네비게이션 컨트롤러를 불러올 수 있나?
-> yes. show 방식으로 가능하다.

  • push 방식 -> 뷰컨트롤러만 불러올 수 있다.
  • show 방식 -> 뷰컨트롤러 뿐만아니라 네비게이션 컨트롤러까지 불러올 수 있다.

참고문서

profile
제가 나중에 다시 보려고 기록합니다 ✏️

0개의 댓글