实时重新加载表视图

时间:2012-06-24 08:21:03

标签: ios uitableview uilocalnotification reloaddata

该应用会收到UILocalNotification,但如果用户在点火时处于UITableViewController,则表视图(包含已安排的通知)不会重新加载。用户必须退出该视图并再次加载视图以便加载单元格,并且由于通知已被触发,因此它不会显示在该表视图的任何单元格上。

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

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

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

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

任何帮助都将得到真正的赞赏,因为这是我发布第一个应用程序的最后细节。

1 个答案:

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

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

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

    UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    

    尽管文档说明了,但在这种情况下,-application:didReceiveLocalNotification:

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