下の画像のようなストーリーボードフローのアプリを作成しています。
ユーザーが「SysalertViewController」からログインすると、「Message List View Controller」に移動し、NSURLConnectionを実行してJSONをテーブルにロードします。ユーザーがテーブルの行をタップすると、「メッセージの詳細」が表示され、そのメッセージの詳細情報が表示されます。
ユーザーがプッシュ通知からアプリを起動すると、起動前のアプリの状態に関係なく、アプリにサーバーから「メッセージリスト」データを読み込んで、デバイスにプッシュされたばかりのメッセージを表示する必要があります。
プッシュ通知に反応するようにアプリに指示するにはdidFinishLaunchingWithOptions
を使用する必要があることはわかっていますが、「メッセージリスト」ビューコントローラーがデータをロードしてから「メッセージの詳細」をプッシュするようにビュー階層を設定するにはどうすればよいですか。適切なメッセージのスタックにコントローラーを表示しますか?
基本的に、この種のメッセージまたはメールアプリの動作を模倣します。通知で開くと、そのメッセージのView Controllerが表示されますが、最初のviewControllerからアプリを起動し、viewControllerを順番に通過したかのように、階層内に戻ることができます。
あなたが説明したことをすることは可能ですが、私はそれをお勧めしません。
まず、ストーリーボードに必要なビューを含む切断されたView Controllerを配置し、ViewControllerに「MyPushNotificationView」のような識別子を付けます。
didFinishLaunchingWithOptions:
では、アプリデリゲートからrootViewControllerにアクセスできます。このコントローラーがナビゲーションコントローラーになります。ナビゲーションコントローラーを使用すると、スタックの一番上に新しいビューコントローラーをプッシュできます。新しいViewControllerを作成するには、識別子「My PushNotificationView」を使用してViewControllerをインスタンス化します。
UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
UIViewController *notificationController = [navController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"];
[navController pushViewController:notificationController animated:YES];
ナビゲーションスタックを中断する代わりに、-presentViewController:animated:completion:
のようなものを使用してモーダルビューを表示することをお勧めします。
UIViewController *rootController = (UIViewController *)self.window.rootViewController;
UIViewController *notificationController = [rootController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"];
[rootController presentViewController:notificationController animated:YES completion:NULL];
これを試してください私は私のアプリケーションの1つで使用しました、グローバルとしてアプリデリゲートの変数を使用します
ex: BOOL gotNotifcation;
-(void)application:(UIApplication*)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NotificationsViewController *notificationobject = [[NotificationsViewController alloc]init];
[self.navigationController pushViewController:notificationobject animated:YES];
gotNotifcation = YES;
}
カスタマイズされたボタンの場合、戻るボタンアクションのNotificationsViewControllerで
-(void)gotoback
{
AppDelegate *delegate =(AppDelegate *)[UIApplication sharedApplication].delegate;
if(delegate.gotNotifcation)
{
delegate.gotNotifcation = NO;
MessageListController *feed = [[MessageListController alloc] init];
[self.navigationController pushViewController:feed animated:NO];
}
else
{
[self.navigationController popViewControllerAnimated:NO];
}
}