您描述的問題是由當前本地通知引起的:處理通知時,它仍在預定通知列表中,因此刷新表視圖將不起作用。解決這個問題是推遲重新加載表視圖,直到通知的處理之後,像
// 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];
}
關於你問題的第二部分(「我怎麼可以把一個特定視圖顯示後通知(當用戶滑動的應用程序圖標時手機被鎖定?「),有兩種情況如何通過本地通知激活應用程序。
- 您的應用程序被暫停,但仍在記憶中。然後選擇本地推送通知將使應用程序進入前景,
-application:didReceiveLocalNotification:
將被調用,並[application applicationState]
將UIApplicationStateInactive
您的應用程序沒有運行,即不暫停,而不是在內存中。然後你會收到在launchOptions
本地通知在-application:didFinishLaunchingWithOptions:
:
UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
儘管文件說什麼,-application:didReceiveLocalNotification:
將不可以在這種情況下調用。
因此,要顯示喚醒應用程序的通知,可以在這兩種情況下推送控制器。
當你說reloadData被實現在每一個可能的地方,這並不清楚你的意思。在您正在實現的TableViewController子類的內部,在接受通知的代碼中,我期望您只需執行[self.tableView reloadData]就可以獲得所需內容。你有代碼可以分享嗎? –
你能解釋你的崩潰的性質嗎? –
我們可以看到一些代碼嗎? – self