您描述的问题是由当前本地通知引起的:处理通知时,它仍在预定通知列表中,因此刷新表视图将不起作用。解决这个问题是推迟重新加载表视图,直到通知的处理之后,像
// 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