#背景
ViewControllerごとにStoryboardを分けている人、そもそもStoryboardを使わない人って一定数いると思うんですけど、そう言った時にTabBarController使ってるのにNavigationControllerの設定もしたいのよねーという人いると思うんですよ。
#実装していきます。
##開発環境
Swift: version 4.0
Xcode: version 9.3
##実装① クラスファイルの作成
TabBarControllerのクラスファイルを作成。あとはタブごとのページのViewControllerがあれば大丈夫です。
class MainTabBarController: UITabBarController {
}
##実装② 変数の用意
各画面となるViewControllerを格納する変数を用意します。
class MainTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
var viewControllers = [UIViewController]()
}
}
##実装③ それぞれの画面の設定(tabの画像など)
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のタブとして設定します。
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