66983


複数のViewControllerとタブバーを持ったiOSアプリを作成しています。  
その中で「最初のタブに戻った場合に所定の処理を実行」というのをやりたいのですが、Swiftコードでタブ移動した場合に検知する方法がわからず困っています。  
タブバーのアイコンをタップした場合の検知は  
<https://stackoverflow.com/questions/33837475/detect-when-a-tab-bar-item-is-
pressed>  
こちらのコードを参考にして検知できるようになったのですが、他のViewControllerから  
`self.tabBarController?.selectedIndex = 0`  
のような形で遷移している処理があり、そちらで移動した場合は上記のURLで書いたコードは反応してくれませんでした。  
コードで遷移させたことを遷移先（最初のタブのViewController）の方で検知する方法はあるのでしょうか。  
お知恵を拝借できましたら幸甚です。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-05-25T09:59:44.417
66974
2020-05-25T20:50:33.510
14346
question
swift ios swift5
Swiftでタブ移動をコードで行った場合に検知する方法はありますか？


`selectedIndex`に自分で代入しているのならタイミングはわかっているので、代入の前か後で自分でなんらかの通知を送るか、下記のように自分でデリゲートメソッドを呼ぶと簡単です。

[code]

    tabBarController.selectedIndex = 0
    if let selectedViewController = tabBarController.selectedViewController {
        tabBarController.delegate?.tabBarController?(tabBarController, didSelect: selectedViewController)
    }
    
[/code]

ライブラリなどの自分が手を出せない部分で呼ばれているなら、下記のようにKVOを用いて`selectedIndex`または`selectedViewController`を監視する方法もあります。

[code]

    kvoToken = tabBarController?.observe(\.selectedIndex, options: [.new]) { (tabBarController, change) in
        if let selectedIndex = change.newValue {
            print(selectedIndex)
        }
    }
    
[/code]

[code]

    kvoToken = tabBarController?.observe(\.selectedViewController, options: [.new]) { (tabBarController, change) in
        if let newValue = change.newValue,
            let viewController = newValue,
            let viewControllers = tabBarController.viewControllers,
            let selectedIndex = viewControllers.firstIndex(of: viewController) {
            print(selectedIndex)
        }
    }
    
[/code]

この２つの方法には違いがあり、`selectedIndex`を監視した場合は代入したときだけ（タブバーをタップしたときには呼ばれない）、`selectedViewController`の場合はどちらのときでも呼ばれます。

あとはUITabBarControllerを継承して`selectedIndex`に`didSet`を設定するというのも考えられます。


CC BY-SA 4.0
2020-05-25T20:50:33.510
66983
2020-05-25T20:50:33.510
5519
66974
answer