【Swift】コードでUITabBarControllerを実装する


Storyboardを使わずに、コードのみでUITabBarControllerを実装する方法まとめ。

環境

  • Xcode12.4
  • Swift5

1. 各タブに表示するViewControllerを準備する

今回は、以下のファイルを新規作成する。
・FirstViewController
・SecondViewController
・ThirdViewController
・FourthViewController

タブを切り替えた際に、わかりやすいようにそれぞれの背景色だけ変更しておく。

FirstViewController
import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .red
    }
}

2. ViewControllerをUITabBarControllerに設定する

MainTabController
import UIKit

class MainTabController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        configureViewControllers()
    }

    func configureViewControllers() {

        let first = FirstViewController()
        first.tabBarItem = UITabBarItem(title: "Home", image: UIImage(systemName: "house"), selectedImage: nil)

        let second = SecondViewController()
        second.tabBarItem = UITabBarItem(title: "Chat", image: UIImage(systemName: "message"), selectedImage: nil)

        let third = ThirdViewController()
        third.tabBarItem = UITabBarItem(title: "Book", image: UIImage(systemName: "book"), selectedImage: nil)

        let fourth = FourthViewController()
        fourth.tabBarItem = UITabBarItem(title: "Person", image: UIImage(systemName: "person"), selectedImage: nil)

        viewControllers = [first, second, third, fourth]
    }
}

Storyboardを使わない設定に変更する

最初はMain.storyboardが呼ばれるようになっているため、修正する。

  1. TARGETS > General > Development InfoのMain Interfaceを空白にする。
  2. Info.plistのInformation Property List > Application Scene Manifest > Scene Configuration > Application Session Role > Item 0 > Storyboard Nameの項目を削除する。
  3. Info.plistのInformation Property List > Main storyboard file base nameの項目を削除する。
  4. SceneDelegate.swiftを修正する。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let scene = scene as? UIWindowScene else { return }
        window = UIWindow(windowScene: scene)
        window?.rootViewController = MainTabController()
        window?.makeKeyAndVisible()
    }