{"id":122,"date":"2025-10-04T09:33:03","date_gmt":"2025-10-04T00:33:03","guid":{"rendered":"https:\/\/devserver.kr\/blog\/?p=122"},"modified":"2025-10-04T09:33:03","modified_gmt":"2025-10-04T00:33:03","slug":"ios-uitabbarcontroller-%ec%82%ac%ec%9a%a9-%eb%b0%a9%eb%b2%95","status":"publish","type":"post","link":"https:\/\/devserver.kr\/blog\/ios\/ios-uitabbarcontroller-%ec%82%ac%ec%9a%a9-%eb%b0%a9%eb%b2%95\/","title":{"rendered":"iOS UITabBarController \uc0ac\uc6a9 \ubc29\ubc95"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><h3>\uba54\uc778\uc774 \ub418\ub294 VC\ub97c \ud558\ub098 \uc900\ube44\ud55c\ub2e4.<\/h3>\n<p>ViewController<\/p>\n<h2>\ud0ed\uc5d0 \ub4e4\uc5b4\uac08 VC\ub4e4\uc744 \ubbf8\ub9ac \uc900\ube44\ud55c\ub2e4.<\/h2>\n<p>FirstVC, SecondVC, ThirdVC \ub4f1\u2026<\/p>\n<h3>tab \ubcc4 \uc544\uc774\ucf58\uc744 \uc900\ube44\ud55c\ub2e4.<\/h3>\n<p>ViewController \uc758 \uc0c1\uc18d \ud074\ub798\uc2a4\uc778 UIViewController \ub97c \uc0ad\uc81c\ud558\uace0 UITabBarController \ub85c \uc791\uc131\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-swift\">import UIKit\n\nclass ViewController: UITabBarController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \/\/ Do any additional setup after loading the view.\n        \n        \/\/ Create Tab one\n        let tabOne = FirstVC()\n        let tabOneBarItem = UITabBarItem(title: &quot;Tab 1&quot;, image: UIImage(named: &quot;Tab1_icon&quot;), selectedImage: UIImage(named: &quot;Tab1_icon&quot;))\n        \n        tabOne.tabBarItem = tabOneBarItem\n        \n        \n        \/\/ Create Tab two\n        let tabTwo = SecondVC()\n        let tabTwoBarItem2 = UITabBarItem(title: &quot;Tab 2&quot;, image: UIImage(named: &quot;Tab2_icon&quot;), selectedImage: UIImage(named: &quot;Tab2_icon&quot;))\n        \n        tabTwo.tabBarItem = tabTwoBarItem2\n        \n        \n        self.viewControllers = [tabOne, tabTwo]\n\n        self.delegate = self\n    }\n}\n<\/code><\/pre>\n<h3>appdelegate.swift \uc5d0\uc11c \uc571\uc758 window\uc5d0 \ubd99\uc774\uae30<\/h3>\n<pre><code class=\"language-swift\">import UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    \n    var window: UIWindow?\n\n    func application(_ application: UIApplication,\n                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n    ) -&gt; Bool {\n        window = UIWindow(frame: UIScreen.main.bounds)\n        window?.makeKeyAndVisible()\n        \n        let tabVC = ViewController()\n        window?.rootViewController = tabVC\n        \n        return true\n    }\n}\n<\/code><\/pre>\n<h3>\ud0ed \uc120\ud0dd \ucc98\ub9ac\ud558\uae30 UITabBarControllerDelegate<\/h3>\n<p>ViewController \uc0c1\uc18d\uc5d0 UITabBarControllerDelegate \ucd94\uac00<\/p>\n<pre><code class=\"language-swift\">self.delegate = self\n\n\/\/ MARK: - UITabBarControllerDelegate\n    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {\n        print(&quot;didSelect item \\(item.tag)&quot;)\n    }\n\n    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {\n        \n        print(&quot; \\(tabBarController.selectedIndex)&quot;)\n    }\n\n<\/code><\/pre>\n<h3>\uc0c9\uc0c1 \uc124\uc815<\/h3>\n<pre><code class=\"language-swift\">UITabBar.appearance().barTintColor = UIColor(red: 0, green: 0\/255, blue: 205\/255, alpha: 1)\n\/\/ or\nUITabBar.appearance().barTintColor = UIColor.blue\n<\/code><\/pre>\n<p>VC \uc5d0\uc11c self.title = \u201ctitle\u201d \uc774\ub77c\uace0 \uc124\uc815\ud558\uba74 TabBarItem\uc758 \ud14d\uc2a4\ud2b8\uac00 \uc790\ub3d9\uc73c\ub85c \ubc14\ub010\ub2e4.\uc8fc\uc758!<\/p>\n<h3>scenedelegate \uc5d0 \ubc14\ub85c \ubc15\uc544\ub123\uc744 \ub54c<\/h3>\n<pre><code class=\"language-swift\">func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n        \/\/ Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.\n        \/\/ If using a storyboard, the `window` property will automatically be initialized and attached to the scene.\n        \/\/ This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).\n        guard let windowScene = (scene as? UIWindowScene) else { return }\n        window = UIWindow(windowScene: windowScene)\n        \n        let tabBarController = UITabBarController()\n        \n        let storyboard = UIStoryboard(name: &quot;Main&quot;, bundle: nil)\n        \n        let homeVC = storyboard.instantiateViewController(identifier: &quot;SB_NAV_HOME&quot;) as! UINavigationController\n        let settingsVC = storyboard.instantiateViewController(identifier: &quot;SB_NAV_SETTINGS&quot;) as! UINavigationController\n        \n        tabBarController.setViewControllers([homeVC, settingsVC], animated: false)\n        \n        if let items = tabBarController.tabBar.items {\n            items[0].selectedImage = UIImage(systemName: &quot;house.fill&quot;)\n            items[0].image = UIImage(systemName: &quot;house&quot;)\n            items[0].title = &quot;HOME&quot;.localized\n            \n            items[1].selectedImage = UIImage(systemName: &quot;gearshape.fill&quot;)\n            items[1].image = UIImage(systemName: &quot;gearshape&quot;)\n            items[1].title = &quot;SETTINGS&quot;.localized\n        }\n        \n        window?.rootViewController = tabBarController\n        window?.makeKeyAndVisible()\n        \n\/\/        window?.overrideUserInterfaceStyle = .light\n    }\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,7],"tags":[],"class_list":["post-122","post","type-post","status-publish","format-standard","hentry","category-ios","category-swift"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":1,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/122\/revisions"}],"predecessor-version":[{"id":123,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/122\/revisions\/123"}],"wp:attachment":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/media?parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/categories?post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/tags?post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}