1. ホーム
  2. iphone

[解決済み] AppDelegate.mで画面上に現在表示されているUIViewControllerを取得する。

2022-06-19 08:53:57

質問

現在の UIViewController は、APNからのプッシュ通知に応答するために、バッジビューを設定する必要があります。しかし、どのようにして UIViewController というメソッドで application:didReceiveRemoteNotificationAppDelegate.m ?

私は self.window.rootViewController を使って、現在表示されている UIViewController である可能性があります。 UINavigationViewController であったり、他の種類のビューコントローラーであったりします。そして、私は、その visibleViewController のプロパティが UINavigationViewController を利用することで UIViewController を画面上に表示させることができます。しかし、もしそれが UINavigationViewController ?

どんな助けでも感謝します! 関連するコードは以下の通りです。

AppDelegate.m

...
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    //I would like to find out which view controller is on the screen here.

    UIViewController *vc = [(UINavigationViewController *)self.window.rootViewController visibleViewController];
    [vc performSelector:@selector(handleThePushNotification:) withObject:userInfo];
}
...

ViewControllerA.m

- (void)handleThePushNotification:(NSDictionary *)userInfo{

    //set some badge view here

}

どのように解決するのですか?

この場合 rootViewController は、コントローラが UINavigationController :

UIViewController *vc = self.window.rootViewController;

ルートビューコントローラがわかれば、あとはUIをどのように構築したかによりますが、コントローラ階層を移動する方法を見つけることができるかもしれません。

アプリの定義方法についてもう少し詳しく教えていただければ、もう少しヒントを与えることができるかもしれません。

編集中です。

もし、一番上の ビュー (ビューコントローラではない) が必要な場合は

[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];

このビューは見えないかもしれないし、サブビューのいくつかに覆われているかもしれませんが...

また、UIに依存しますが、これは役に立つかもしれません...