9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITabBarControllerとUINavigationControllerをコードで作る

Last updated at Posted at 2018-04-26

#背景
ViewControllerごとにStoryboardを分けている人、そもそもStoryboardを使わない人って一定数いると思うんですけど、そう言った時にTabBarController使ってるのにNavigationControllerの設定もしたいのよねーという人いると思うんですよ。

#実装していきます。
##開発環境
Swift: version 4.0
Xcode: version 9.3

##実装① クラスファイルの作成
TabBarControllerのクラスファイルを作成。あとはタブごとのページのViewControllerがあれば大丈夫です。

MainTabBarController.swift

class MainTabBarController: UITabBarController {
}

##実装② 変数の用意
各画面となるViewControllerを格納する変数を用意します。

MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var viewControllers = [UIViewController]()

    }
}

##実装③ それぞれの画面の設定(tabの画像など)

MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var viewControllers = [UIViewController]()
        let firstViewController = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController()
        firstViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(firstViewController!)

        let secondViewController = UIStoryboard(name: "SecondViewController", bundle: nil).instantiateInitialViewController()
        secondViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(secondViewController!)
    }
}

##実装④ NavigatoinControllerの設定
全ての画面を設定した最後にすべての画面の配列のインスタンスにUINavigationControllerを設定し、TabBarControllerのタブとして設定します。

MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var viewControllers = [UIViewController]()

        let firstViewController = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController()
        firstViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(firstViewController!)

        let secondViewController = UIStoryboard(name: "SecondViewController", bundle: nil).instantiateInitialViewController()
        secondViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(secondViewController!)

        self.viewControllers = viewcontrollers.map{ UINavigationController(rootViewController: $0)}
        self.setViewControllers(viewControllers, animated: false)
    }
}

以上で完了です、simulatorで動かしてみてください。

#最後に
正直、viewDidLoad()に書くのは如何なものかと今でも疑問に思っているので、もしいい解決策、例えばinit()に書けよとかいうのであれば教えてください。

#参考文献
海外のサイトですが、このサイトのまんまにやりました。正直細かい部分は違う部分もありますが、核となる部分は同じです。
https://medium.com/@ITZDERR/uinavigationcontroller-and-uitabbarcontroller-programmatically-swift-3-d85a885a5fd0

9
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?