3

应用程序收到一个UILocalNotification,但如果用户在UITableViewController触发时间,表视图(包含计划的通知)不会重新加载。用户必须退出该视图并再次加载视图,以便加载单元格,并且由于通知已经触发,它不会显示在该表视图的任何单元格上。

问题是:如果用户触摸包含刚刚触发的通知的特定 tableView 单元格,应用程序崩溃,导致通知不再存在。

我已经- (void)reloadData在每个可能的地方实现了,但它仍然不能实时加载。

对此有什么更好的解决方案?

其他细节,如何在通知显示后推送特定视图(当用户在手机锁定时滑动应用程序图标时)?

任何帮助都将不胜感激,因为还有最后的细节来发布我的第一个应用程序。

4

1 回答 1

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];
}

至于您问题的第二部分(“如何在显示通知后推送特定视图(当手机锁定时用户滑动应用程序图标时?”),有两种情况下如何激活应用程序本地通知。

  1. 您的应用程序已暂停,但仍在内存中。然后选择本地推送通知将使应用程序进入前台,-application:didReceiveLocalNotification:将被调用,[application applicationState]并将UIApplicationStateInactive
  2. 您的应用程序没有运行,即没有挂起,不在内存中。launchOptions然后您将在in 中收到本地通知-application:didFinishLaunchingWithOptions:

    UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    

    尽管文档说了什么,在这种情况下不会-application:didReceiveLocalNotification:被调用。

因此,为了显示唤醒应用程序的通知,您可以在这两种情况下推送您的控制器。

于 2012-06-24T13:19:46.257 回答