

表題のように、「AppDeledate」内のイベントからTabBarControllerのtabbarにバッジをセットしたいのですが、TabBarControllerのtabbarを参照する方法がわかりません。初歩的な質問かもしれませんが、ご教授願いたく思っております。

具体的には、Push通知（didReceiveRemoteNotification）イベントの発火で４つあるタブの４番目にバッジの内容を更新したいという事でございます。

[code]

    func application(application: UIApplocation, didReceiveRemoteNotification userInfo: [NSObject : AnyObjevt]) {
        let tb = TabBarController()
        tb.tabbar.items![3].badgeValue = "3" /* new or 3 etc...*/
        ↑当然エラーとなります。
    }
    
[/code]

今回のこの質問のように、AppDelegateの発火イベント（通知イベント以外でも）から、他のViewのテキストボックスの内容や、ラベルの内容などの操作をするための方法がわかりません。

例えば、FirstViewControllerのボタンを押下すると、SecondViewController内のテキストボックスの値を変更するなど。AppDelegateも含め、異なるViewクラス間の操作の基本が、Swift初めて間もなく理解できておりませんで、よろしくお願いいたします。


CC BY-SA 3.0
2015-10-05T08:02:40.737
17265
2021-02-13T05:16:39.510
12504
question
swift
Swift「AppDelegate」内のイベントからTabBarのバッジをセットしたい


AppDelegate.swiftの内容に変更を加えていなければ（もちろんコードの追加はなさっているわけですが）、プロパティ`window`がありますね？

[code]

    if let tabBarController = self.window?.rootViewController as? UITabBarController {
    }
    
[/code]

で、TabBar Controllerを取得できます。

[code]

    if let tabBarController = self.window?.rootViewController as? UITabBarController {
        tabBarController.tabBar.items![3].badgeValue = "3"
    }
    
[/code]


CC BY-SA 3.0
2015-10-05T08:17:31.670
17266
2015-10-05T08:33:38.573
2015-10-05T08:33:38.573
7362
7362
17265
answer


iOS13からはSceneDelegateでないと基本windowが取得できなくなったようで`sceneWillEnterForeground(_
scene: UIScene)`で呼ぶことで行けました！

[code]

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
    
        func sceneWillEnterForeground(_ scene: UIScene) {
            if let tabBarController = self.window?.rootViewController as? UITabBarController {
                tabBarController.tabBar.items![3].badgeValue = "3"
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-02-13T05:16:39.510
73963
2021-02-13T05:16:39.510
32641
17265
answer