써니쿠키의 IOS 개발일기

[swift ]navigation controller 코드로 구현하기 본문

swift, Ios

[swift ]navigation controller 코드로 구현하기

sunnyCookie 2022. 9. 16. 21:54

어떻게 공부하게 되었는가?
교육중 코드작성 한 것을 현직자인 리뷰어님이 리뷰를 해주는데 완성 전에 내준 도전과제였다.
사실 9할은 동기가 도와줬다ㅎㅎ.....나란아이 배울 수 있는 동기가 있어 감사하다 😂
나도 지식을 촵촵 쌓아나가 꼭 도움이 될 수 있는 사람이 되자 💪🏻

처음엔 구글링으로 SceneDelegate도 만졌다가..
예제 코드 따라서 코드도 구현해보고 하다가 원리를 몰라서 한참을 헤맸다!
원하는 코드구현을 해냈지만
사람은 망각의 동물이니 하루 후 복습하면서 다시 내용을 정리해보았다.


✔️ 우선 기존 화면이동 방식은 이러했다.

  • VC1 -> VC2로 이동하는 방식은 모달이었는데 모달로 띄웠을 때도 navigationBar를 이용하기 위해서 NavigationController로 이동하여 View를 띄어주게했었다.
    • VC2를 modal로 띄어주면서 NavigationBar를 UIKit으로 추가해줘도 되지만... 바의 회색 배경색을 쓰고 싶지 않았다!
  • 즉, [NC1 > VC1 > NC2 > VC2]

 

💡 수정한 이동방식은 이러하다.

리뷰어 코멘트
🗣 네비게이션 컨트롤러 관련해서 스토리보드로 연결된 부분을 제거하고 코드로 연결할 수 있도록 수정이 가능하실까요?

  • ( 참고로 위에서 보면 VC1을 스토리보드의 NC1을 이용해 화면에 띄워줬는데 그 첫 NC1은 건드리지 않는 내용입니다...)
  • 기존방법에서 스토리 보드 상에서 [VC1 > NC2 > VC2] 부분을 코드로 NC2를 구현해주면서[VC1 > VC2]하자!
  • 코드로 navigation controlloer사용하며 modal로 이동하게 했다.
  • [NC1 > VC1 > NC2(VC2)]
    • 참고로 기존화면이동방식에서 VC2에 navigationControllerBar를 구현해줬기 때문에 스토리보드에는 네비게이션바가 안보여도 시뮬레이터에서는 bar가 보였다.
    • 만약 그렇지 않았더라면 bar도 코드로 구현해줘야함!!
     

 

🔍 코드 구현부

✔️ 코드를 보기전 알고있어야 하는 함수

  • 인스턴스 메서드 instantiateViewController(withIdentifier:) 는 지정된 식별자를 가지고 스토리보드의 데이터를 초기화 해 뷰 컨트롤러를 만든는 메서드이다.
  • 이니셜라이저인 init(rootViewController:) 는 새로운 navigation Controller를 이니셜라이징해주고 리턴해주는 메서드이다.
  • 인스턴스 메서드 present(_:animated:completion:)
    뷰컨은 모달하게 보여주는 메서드이다.
    • 프로퍼티1: 띄어줄 화면 (UIViewController타입)
    • 프로퍼티2: animate true of false
    • 프로퍼티3: 보여주기가 끝나고 작동하는 클로저
//VC1에서 작성 및 사용
func moveToVC2() {
        guard let VC2 = self.storyboard?.instantiateViewController(withIdentifier: "VC2StroyBoardID") as? ViewController2 else {return}

        let NC2 = UINavigationController.init(rootViewController: VC2)

        self.present(NC2, animated: true, completion: nil)
    }
  1. VC2를 storyboard?.instantiateViewController를 이용해 생성해주는데 storyboard? 에서 nil이 걸릴수도 있으므로 안전하게 guard let을 이용해준다.
    이 때 추가로 VC2의 타입이 UIViewController타입이 아니라 ViewController2 타입이 될 수 있도록 as? 로 타입캐스팅도 해줘야한다.
  2. 이제 NavigationController로 감싸주자!
    UINavigationController.init(rootViewController:) 메서드를 이용해 네비게이션컨트롤러를 생성해주는데 rootView로 VC2를 지정해준다.
  3. present메서드를 이용해 화면 띄어주자!

참고 문서

반응형
Comments