OKADA LABO

[swift]でUiTabBarControllerで特定のボタンを押した時だけ、ページをmodal表示(遷移)させたい。

UiTabBarControllerで特定のボタンを押した時だけ、ページをmodal表示(遷移)させたい場合。
ようはインスタのTabBarみたいな感じですね。投稿ボタンおす時だけmodaly表示されますね
tabbarの投稿ボタンを押した時だけPresent Modalyのように遷移する感じです。

たとえばツイッター的なアプリのTabBarで
TabBarControllerで3ページ作るとする。topページ、投稿ページ、マイページ。その3つのボタンが配置されます。

2番目の投稿ボタン(投稿ページ)を押した時だけ、投稿画面が下からスイっとmodal表示される。みたいな感じにしたい。

Story Board上で、まずUIViewControllerを3つ用意してUITabBarControllerにRelationship Segueつなぎますね。

あとStory Board上で、UITabBarControllerには、TabBarViewController.swiftをつなげるとして。

まあ、こんな感じですかね

tabbar設定イメージ

modal表示させたい2番目の投稿ページの、Storyboard idとclassを使いますので、投稿ページのUIViewControllerに設定しといてください

Storyboard id:ShareTweetViewController、class:ShareTweetViewController.swift としておきましょうか

そしてUiTabBarControllerに繋いだTabBarViewController.swiftには、このように書きます

TabBarViewController.swift

import UIKit

class TabBarViewController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.delegate = self
        
        //TabBarの装飾
        //指定する色を定義
        let blue = UIColor(red: 0 / 255, green: 161 / 255, blue: 255 / 255, alpha: 1.0)

        
        // TabBarの背景色の設定
        UITabBar.appearance().barTintColor = blue

        //3ページを格納
        let firstViewController  = self.viewControllers![0]
        let secondViewController = self.viewControllers![1]
        let thirdViewController = self.viewControllers![2]
        
        //TabBarのボタンの画像のパーツ
        let homeImage            = UIImage(named: "home")
        let highlightedHomeImage = UIImage(named: "highlighted_home")
        let addTweetImage            = UIImage(named: "addTweet")
        let highlightedAddTweetImage = UIImage(named: "highlighted_addTweet")
        let myPageImage            = UIImage(named: "myPage")
        let highlightedMyPageImage = UIImage(named: "highlighted_myPage")
        
        //それぞれのView Controllerのボタン(Tab Bar Item)に用意した画像を設定
        firstViewController.tabBarItem  = UITabBarItem(title: "HOME", image: homeImage, selectedImage: highlightedHomeImage)
        secondViewController.tabBarItem = UITabBarItem(title: "ツイート投稿", image: addTweetImage, selectedImage: highlightedAddTweetImage)
        thirdViewController.tabBarItem = UITabBarItem(title: "マイページ", image: myPageImage, selectedImage: highlightedMyPageImage)

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        if viewController is ShareTweetViewController { //もしShareTweetViewController.swiftをclass指定してあるページ行きのボタンをタップしたら
            if let newVC = tabBarController.storyboard?.instantiateViewController(withIdentifier: "ShareTweetViewController"){ //withIdentifier: にはStory Board IDを設定
                tabBarController.present(newVC, animated: true, completion: nil)//newVCで設定したページに遷移
                return false
            }
        }
        return true
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

これでうまくいきます。

拡張性を考えて、それぞれのviewControllerにNavigation Controllerをembed inさせてもいいですね

そうすればインスタみたいに、上部のnavigationにキャンセルボタン入れられますからね。

その場合はそのNavigation Controllerに、そのStoryboard idとclassを使いますんで設定してください。