UITabBarController에서 UINavigationController 설정 문제 해결

Eden·2024년 12월 20일

iOS

목록 보기
14/18
post-thumbnail

문제 상황

UITabBarController에서 각 탭의 뷰 컨트롤러에 UINavigationController를 사용하고 싶었지만, 하위 뷰 컨트롤러에서 navigationController?.pushViewController가 작동하지 않음.


첫 시도와 실패

  • setupTabBar 메서드에서 각 탭의 UIViewControllerUINavigationController로 감싸고 싶었으나, viewControllers 배열에 직접 뷰 컨트롤러를 추가함.
  • 결과적으로 UINavigationController가 무시되었고, navigationControllernil로 출력됨.

원인

UITabBarControllerviewControllers 배열에 UIViewController를 직접 추가했기 때문에 UINavigationController 계층이 올바르게 설정되지 않음.


해결 방법

UINavigationController로 각 뷰 컨트롤러를 감싸고, viewControllers 배열에 UINavigationController를 추가하도록 수정.


잘 이동하는 모습이다.

해결 코드

private func setupTabBar() {
    // 각 뷰 컨트롤러 생성 및 네비게이션 컨트롤러로 감싸기
    let movieListVC = MovieListViewController()
    let movieListNavVC = UINavigationController(rootViewController: movieListVC)

    let searchVC = SearchViewController()
    let searchNavVC = UINavigationController(rootViewController: searchVC)

    let mypageVC = MyPageViewController()
    let mypageNavVC = UINavigationController(rootViewController: mypageVC)

    // 탭바 아이템 설정
    movieListVC.tabBarItem = UITabBarItem(title: "홈", image: UIImage(systemName: "house.fill"), tag: 0)
    searchVC.tabBarItem = UITabBarItem(title: "검색", image: UIImage(systemName: "sparkle.magnifyingglass"), tag: 1)
    mypageVC.tabBarItem = UITabBarItem(title: "마이", image: UIImage(systemName: "rectangle.badge.person.crop"), tag: 2)

    // 탭바 스타일 설정
    self.tabBar.tintColor = .black

    // UINavigationController 배열을 viewControllers에 추가
    viewControllers = [movieListNavVC, searchNavVC, mypageNavVC]
}

검증

  1. 각 탭의 뷰 컨트롤러에서 navigationController가 정상적으로 초기화되었는지 확인
print(navigationController) // UINavigationController 출력
  1. 뷰 컨트롤러에서 화면 전환 동작
navigationController?.pushViewController(DetailViewController(), animated: true)   
  • 정상적으로 화면이 전환됨.

정리

  • UITabBarControllerviewControllers는 반드시 UINavigationController를 포함해야 하위 뷰 컨트롤러에서 navigationController를 사용할 수 있다.
  • viewControllers = [UIViewController]로 설정하면 네비게이션 컨트롤러 계층이 무시됨.

배운 점

  • UITabBarController에서 네비게이션 기능을 사용하려면 각 탭의 뷰 컨트롤러를 반드시 UINavigationController로 감싸야 한다.
  • viewControllers 배열에 올바른 계층 구조를 설정하지 않으면 예상치 못한 동작이 발생할 수 있다.

profile
🌐 Frontend &&  iOS && 대학생

2개의 댓글

comment-user-thumbnail
2024년 12월 20일

모아나 2 3장이요~

1개의 답글