TabBarControllerで実装したボトムタブを選択すると、通常は画面が切り替わります。
今回は、特殊なボタンとして画面をModal(下から上へ出現)表示させたい時の実装です。
(真ん中のボタンが丸く縁取られているアプリに多いと思います)
Modalで開きたい画面クラスがTargetViewController
と仮定して解説していきます。
ソースコード
TabBarController.swift
import UIKit
final class TabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self // UITabBarControllerDelegate
}
}
// MARK: - UITabBarControllerDelegateに適合
extension TabBarController: UITabBarControllerDelegate {
// TabBarItemが選択された時に呼ばれる
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// TabBarItemタップでModal表示をする画面を指定して実装
if viewController is TargetViewController {
if let newVC = UIStoryboard(name: "Target", bundle: nil).instantiateInitialViewController() {
tabBarController.present(newVC, animated: true, completion: nil)
return false
}
}
return true
}
}
実装手順
-
delegate = self
を書くのを忘れない -
extention
でUITabBarControllerDelegate
に適合する -
tabBarController(_:shouldSelect:)->Bool
メソッドを実装 - 開かれるViewControllerが対象のものだったら、という条件でif分岐
- あとは、ViewControllerをインスタンス化し、
present(_:animated:completion)
メソッドで画面をModal表示させればOKです!
NavigationControllerを使用している場合
TargetViewControllerでNavigationItemを使いたい等の理由でNavigationControllerを使用する場合
TabBarController.swift
if viewController.children.first is TargetViewController {
というようにすればNavigationControllerが間にあっても判定可能です。
もし、もっと簡単な方法があればぜひ教えてください。