あなたが説明する問題は、現在のローカル通知が原因です。通知が処理されている間、スケジュールされた通知のリストにまだあるため、テーブルビューを更新しても効果はありません。この問題の解決策は、通知が処理されるまでテーブル ビューの再読み込みを延期することです。
// In your app delegate
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.localNotificationsController reloadDataIfNeeded];
});
}
// In your controller that shows the local notifications
- (void)reloadDataIfNeeded
{
if (![self isViewLoaded]) return;
[self.tableView reloadData];
}
一度だけ起動する通知のみを使用する場合は、リストから通知を削除することもできます (通知が消えることを確実にするため):
// In your app delegate
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
[application cancelLocalNotification:notification];
[self.localNotificationsController reloadDataIfNeeded];
}
質問の 2 番目の部分 (「通知が表示された後 (電話がロックされているときにユーザーがアプリのアイコンをスライドさせたとき)、特定のビューをプッシュするにはどうすればよいですか?」) については、アプリケーションをアクティブにする方法が 2 つあります。ローカル通知。
- アプリケーションは中断されましたが、まだメモリ内にあります。次に、ローカル プッシュ通知を選択すると、アプリがフォアグラウンドに入り、
-application:didReceiveLocalNotification:
呼び出されて[application applicationState]
、UIApplicationStateInactive
アプリケーションは実行されていません。つまり、中断されておらず、メモリ内にもありません。launchOptions
次に、次のローカル通知を受け取ります-application:didFinishLaunchingWithOptions:
。
UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
ドキュメントに記載されている内容にもかかわらず、この場合は呼び出され-application:didReceiveLocalNotification:
ません。
したがって、アプリケーションを起動した通知を表示するには、これら 2 つのケースでコントローラーをプッシュします。