[Swift]タブ切り替え時に切り替え先のメソッドを実行する

2018年9月6日ITSwift

こんにちは、ハラダ(@nobuhiro_harada)です

切り替え元タブと切り替え先タブで同じデータを違うデザインで表示しているアプリを作っているのですが

切り替え元タブで新しくデータを登録しても、切り替え先タブはアプリ起動時に取ってきたデータをそのまま表示していました

タブを切り替えた時に新しくデータを取ってくるように切り替え先タブのメソッドを実行するようデリゲートを設定してみまして、その手順になります

サンプルは、、、タブA,B に それぞれViewControllerA,B を当て

タブB以外のタブからタブBに移動した際にViewControllerBのメソッドを実行します

挙動確認:

ViewControllerA、ViewControllerB、MyTabbarControllerを作成

ViewControllerA、ViewControllerB、MyTabbarControllerファイルをそれぞれ新規作成し、Storyboard で TabBarController、ViewControllerA、ViewControllerBを作成します

change-tab1

それぞれクラス名(ファイル名)を割り当てます。※ここでは MyTabbarController のみ載せています

change-tab2

MyTabbarDelegateを作成

MyTabbarDelegateプロトコルを下記のように作成

MyTabBarDelegate.swift

import UIKit

protocol MyTabBarDelegate {
    func didSelectTab(tabBarController: UITabBarController)
}

MyTabbarControllerでデリゲート

UITabBarControllerDelegate を継承し、didSelect メソッドを実装
これでタブバー内のタブがタップされた時にこのメソッドが呼び出され、MyTabBarDelegate を継承している ViewController かどうか判定されます
MyTabBarDelegate を継承している ViewController だったら、didSelectTab メソッドが実行されます

MyTabbarController.swift

import UIKit

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.delegate = self
    }
    
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController is MyTabBarDelegate {
            let vc = viewController as! MyTabBarDelegate
            vc.didSelectTab(tabBarController: self)
        }
    }
}

MyTabbarDelegateをViewControllerBにて継承

ViewControllerB に MyTabBarDelegate を継承し、didSelectTab メソッドを実行
ViewControllerB の onTapViewContorollerB メソッドが実行され、アラートが表示されます

ViewControllerB.swift

import UIKit

class ViewControllerB: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func onTapViewContorollerB() {
        let alert: UIAlertController = UIAlertController(title: "アラート表示", message: "ViewControllerBに切り替わりました!", preferredStyle: .alert)
        
        let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil)
        
        alert.addAction(defaultAction)
        
        present(alert, animated: true, completion: nil)
    }
}

extension ViewControllerB: MyTabBarDelegate {
    
    func didSelectTab(tabBarController: UITabBarController) {
        onTapViewContorollerB()
    }
}

念のため ViewControllerA.swift も載せておきますが、こちらは何も処理を追加していません

ViewControllerA.swift

import UIKit

class ViewControllerA: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
    
}

以上になります

挙動確認:

ひとこと

今年は花粉に苦戦してますが、今年こんだけやられたことにより耐性がついたと思うので、来年は大丈夫ですよね!?

スポンサーリンク

Posted by nobuhiro harada