안녕하세요~ iOS 개발자 루크입니다
스토리보드없이 코딩하기 제 5탄 네비게이션컨트롤러편입니다
본 포스팅은 이전 포스팅과 이어지는 포스팅입니다 참고해주세요!
이전 포스팅에서 우리는 탭바 컨트롤러를 만들어보았습니다.
탭바 컨트롤러와 네비게이션 컨트롤러를 동시에 사용해야 하는 경우에는 어떻게 해야할까요?
설명 시작합니다 ㅎ
네비게이션 컨트롤러 인스턴스 생성
let nav = UINavigationController(rootViewController: rootViewController)
nav.tabBarItem.image = UIImage(named: "home_unselected") // 탭바 아이템 이미지 추가
nav.navigationBar.barTintColor = .white
nav.navigationBar.backgroundColor = .white
Swift
복사
먼저 UINavigationController 의 인스턴스를 생성해줍니다.
이때 rootViewController 에는 각 tab 에 들어갈 ViewController 인스턴스를 넣어주면 됩니다.
그러곤 네비게이션 바에 대한 여러가지 초기 설정을 진행해줍니다.
탭 바에 추가.
그러곤 이전 포스팅에서 했던 것 처럼
UITabBarController 의 viewControllers 프로퍼티에 이렇게 생성한 네비게잇녀 컨트롤러의 인스턴스를 넣어줍니다.
viewControllers = [nav]
Swift
복사
모든 Tab 에 대해 반복 수행
위 코드를 각각의 tab에 대해 수행해주고 viewControllers 프로퍼티에 어레이로 전달해줍니다.
viewControllers = [nav1, nav2, nav3, nav4]
Swift
복사
보일러 플레이트 코드 문제 해결하기
다만 이렇게되면 중복되는 코드가 너무 많아집니다
따라서 헬퍼 함수를 하나 정의해서 중복 코드를 줄여보겠습니다.
// 좋은 프로그래머가 되기 위해서는 중복코드를 피해야한다.
func templateNavigationController(image: UIImage?, rootViewController: UIViewController) -> UINavigationController {
let nav = UINavigationController(rootViewController: rootViewController)
nav.tabBarItem.image = image
nav.navigationBar.barTintColor = .white
nav.navigationBar.backgroundColor = .white
return nav
}
Swift
복사
이렇게 템플릿이 되는 함수를 정의해주고 각각의 탭에 대해 함수를 호출해 주겠습니다.
최종
func configureViewControllers() {
let feed = FeedController()
let nav1 = templateNavigationController(image: UIImage(named: "home_unselected"), rootViewController: feed)
let explore = ExploreController()
let nav2 = templateNavigationController(image: UIImage(named: "search_unselected"), rootViewController: explore)
let notification = NotificationController()
let nav3 = templateNavigationController(image: UIImage(named: "like_unselected"), rootViewController: notification)
let conversation = ConversationController()
let nav4 = templateNavigationController(image: UIImage(named: "ic_mail_outline_white_2x-1"), rootViewController: conversation)
viewControllers = [nav1, nav2, nav3, nav4]
}
Swift
복사
다만 이렇게 하면 네비게이션 컨트롤러의