5 つのタブを持つタブ付きアプリケーションがあります。
アプリはインデックス 0 のタブで開始します
私のアプリがプッシュ通知を受け取ったら、新しいView Controllerをインデックス1のタブにプッシュしたい.
私のコード:
AppDelegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)pushData {
UITabBarController *tabb = (UITabBarController *)self.window.rootViewController;
tabb.selectedIndex = 1;
[[NSNotificationCenter defaultCenter] postNotificationName:@"pushImage" object:@"this is my item id from pushData"];
}
ProfileViewController (タブ インデックス 1)
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushImage:) name:@"pushImage" object:nil];
}
-(void) pushImage: (NSNotification*) notification {
NSString* text = notification.object;
NSLog(@"My id from pushData: %@", text);
}
私の問題は、AppDelegate が通知を発行したときに、初期化がまだ行われていないため、ProfileViewController が通知に応答できないことです。
手動でタブ 1 を開き、再びタブ 0 に戻ると、通知が投稿され、完全に応答します。タブ 1 が読み込まれた後に通知を投稿する必要があります。
TabBarApplication の AppDelegate から新しい VC をプッシュする私のソリューション
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)pushData {
// ......
if([[pushData objectForKey:@"type"] integerValue] == 0){
// ....
}
else if([[pushData objectForKey:@"type"] integerValue] == 2){
[self handleLikePush:pushData applicationState:application.applicationState];
}
}
-(void)handleLikePush:(NSDictionary *)pushData applicationState:(UIApplicationState) applicationState{
//..
DetailImageViewController *detailImage = [[DetailImageViewController alloc] initWithImageId:imageId];
[self pushViewControllerToCurrentTab:detailImage];
}
}
- (void)pushViewControllerToCurrentTab:(UIViewController *)vc{
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *selectedTabNC = (UINavigationController *)tabBarController.selectedViewController;
if (selectedTabNC != nil) {
[selectedTabNC pushViewController:vc animated:YES];
}
else{
NSLog(@"NavigationController not found");
}
}