2012-06-24 48 views
3

该应用收到UILocalNotification,但如果用户在启动时间位于UITableViewController,表格视图(包含预定通知)不会重新加载。用户必须退出该视图并再次加载视图,以便加载单元格,并且,由于通知已被触发,它将不会显示在该表视图的任何单元格中。实时刷新表格视图

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

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

什么是更好的解决方案呢?

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

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

+0

当你说reloadData被实现在每一个可能的地方,这并不清楚你的意思。在您正在实现的TableViewController子类的内部,在接受通知的代码中,我期望您只需执行[self.tableView reloadData]就可以获得所需内容。你有代码可以分享吗? –

+0

你能解释你的崩溃的性质吗? –

+0

我们可以看到一些代码吗? – self

回答

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:可以在这种情况下调用。

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

+0

有没有更好的答案。非常非常感谢你。 –