该应用会收到UILocalNotification
,但如果用户在点火时处于UITableViewController
,则表视图(包含已安排的通知)不会重新加载。用户必须退出该视图并再次加载视图以便加载单元格,并且由于通知已被触发,因此它不会显示在该表视图的任何单元格上。
问题是:如果用户触摸包含刚刚触发的通知的特定tableView单元格,则应用程序崩溃,导致通知不再存在。
我已经在每个可能的地方实施了- (void)reloadData
,但它仍然没有实时加载。
对此有什么更好的解决方案?
其他细节,如何在显示通知后推送特定视图(当用户在手机锁定时滑动应用程序图标时)?
任何帮助都将得到真正的赞赏,因为这是我发布第一个应用程序的最后细节。
答案 0 :(得分:1)
您描述的问题是由当前的本地通知引起的:处理通知时,它仍然在预定通知列表中,因此刷新表视图将不起作用。这个问题的解决方案是推迟重新加载表视图,直到处理完通知之后,如
// 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:
将不。
因此,为了显示唤醒应用程序的通知,您可以在这两种情况下推送控制器。