[swift] navigation bar

chosh·2023년 5월 12일
0
  1. navigation bar 를 생성하기 위해서는 UITabBarController 프로토콜을 채택해야 된다.

    final class RMTabBarController: UITabBarController {
        override func viewDidLoad() {
    	    super.viewDidLoad()
        }
    }
  2. navigation에 사용할 뷰컨 파일 생성
    폴더 구조를 Controller/Core 로 그룹을 만들어 준다
    new file -> Swift File 을 눌러서 프로젝트를 생성

    • RMCharacterViewController
    • RMLocationViewController
    • RMEpisodeViewController
    • RMSettingViewController
    import UIKit
    
    final class RMCharacterViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .systemBackground
            title = "Characters"
        }
    }
    1. 더이상 상속 되지 않도록 final 키워드를 붙여줌
    2. UIViewController 프로토콜을 채택하도록 설정
    3. viewDidLoad를 재정의
  1. TabBar를 지정 할곳에서 UI를 작성할 함수를 viewDidLoad 함수 안에 만들어 준다

    import UIKit
    
    final class RMTabBarController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setUpTabs()
        }
    
        private func setUpTabs() {
    
        }
    }
  2. 생성한 뷰컨트롤 파일을 상수로 관리하고, UINavigationController 매서드로 정의 해준다

    import UIKit
    
    final class RMTabBarController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setUpTabs()
        }
    
        private func setUpTabs() {
            let characterVC = RMCharacterViewController()
            let locationVC = RMLocationViewController()
            let episodesVC = RMEpisodeViewController()
            let settingsVC = RMSettingViewController()
    
            let nav1 = UINavigationController(rootViewController: characterVC)
            let nav2 = UINavigationController(rootViewController: locationVC)
            let nav3 = UINavigationController(rootViewController: episodesVC)
            let nav4 = UINavigationController(rootViewController: settingsVC)
        }
    }
  3. navigation 에 대한 타이틀이나 tab버튼에 대한 정의를 해준다

    private func setUpTabs() {
            let characterVC = RMCharacterViewController()
            let locationVC = RMLocationViewController()
            let episodesVC = RMEpisodeViewController()
            let settingsVC = RMSettingViewController()
    
            characterVC.navigationItem.largeTitleDisplayMode = .automatic
            locationVC.navigationItem.largeTitleDisplayMode = .automatic
            episodesVC.navigationItem.largeTitleDisplayMode = .automatic
            settingsVC.navigationItem.largeTitleDisplayMode = .automatic
    
            let nav1 = UINavigationController(rootViewController: characterVC)
            let nav2 = UINavigationController(rootViewController: locationVC)
            let nav3 = UINavigationController(rootViewController: episodesVC)
            let nav4 = UINavigationController(rootViewController: settingsVC)
    
            nav1.tabBarItem = UITabBarItem(title: "Characters",
                                        image: UIImage(systemName: "person"),
                                        tag: 1)
            nav2.tabBarItem = UITabBarItem(title: "Locations",
                                        image: UIImage(systemName: "globe"),
                                        tag: 2)
            nav3.tabBarItem = UITabBarItem(title: "Episodes",
                                        image: UIImage(systemName: "tv"),
                                        tag: 3)
            nav4.tabBarItem = UITabBarItem(title: "Settings",
                                        image: UIImage(systemName: "gear"),
                                        tag: 4)
    
            for nav in [nav1, nav2, nav3, nav4] {
                nav.navigationBar.prefersLargeTitles = true
            }
    }
    1. title display mode를 설정해준다
    2. tabBarItem을 UITabBarItem를 이용해서 설정 해준다
      • title
      • image(icon)
      • tag
    3. for문을 돌려서 Title 스타일을 적용해준다
  1. 화면에 그려주기 위해서 setViewController 를 호출한다
    setViewControllers(
        [nav1, nav2, nav3, nav4],
        animated: true
    )

최종 TabbarController 코드

import UIKit

final class RMTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpTabs()
    }
    
    private func setUpTabs() {
        let characterVC = RMCharacterViewController()
        let locationVC = RMLocationViewController()
        let episodesVC = RMEpisodeViewController()
        let settingsVC = RMSettingViewController()
        
        characterVC.navigationItem.largeTitleDisplayMode = .automatic
        locationVC.navigationItem.largeTitleDisplayMode = .automatic
        episodesVC.navigationItem.largeTitleDisplayMode = .automatic
        settingsVC.navigationItem.largeTitleDisplayMode = .automatic
        
        let nav1 = UINavigationController(rootViewController: characterVC)
        let nav2 = UINavigationController(rootViewController: locationVC)
        let nav3 = UINavigationController(rootViewController: episodesVC)
        let nav4 = UINavigationController(rootViewController: settingsVC)
        
        nav1.tabBarItem = UITabBarItem(title: "Characters",
                                       image: UIImage(systemName: "person"),
                                       tag: 1)
        nav2.tabBarItem = UITabBarItem(title: "Locations",
                                       image: UIImage(systemName: "globe"),
                                       tag: 2)
        nav3.tabBarItem = UITabBarItem(title: "Episodes",
                                       image: UIImage(systemName: "tv"),
                                       tag: 3)
        nav4.tabBarItem = UITabBarItem(title: "Settings",
                                       image: UIImage(systemName: "gear"),
                                       tag: 4)
        
        for nav in [nav1, nav2, nav3, nav4] {
            nav.navigationBar.prefersLargeTitles = true
        }

        setViewControllers(
            [nav1, nav2, nav3, nav4],
            animated: true
        )
    }
}

참고자료

Build FULL iOS App in Swift (Rick & Morty | 2023) – Part 1

profile
제가 참고하기 위해 만든 블로그라 글을 편하게 작성했습니다. 틀린거 있다면 댓글 부탁드립니다.

0개의 댓글