实时重新加载表格视图

Posted

技术标签:

【中文标题】实时重新加载表格视图【英文标题】:Reload table view in real time 【发布时间】:2012-06-24 08:21:02 【问题描述】:

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

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

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

什么是更好的解决方案?

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

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

【问题讨论】:

当你说 reloadData 在每一个可能的地方实现时,你的意思并不清楚。在您正在实现的 TableViewController 子类中,在接受通知的代码中,我希望您只需要执行 [self.tableView reloadData] 即可获得所需的内容。你有可以分享的代码吗? 您能解释一下您的崩溃的性质吗? @AlbrahimZ 让我更好地解释一下:我有一个由未来 UILocalNotifications 填充的 tableview。如果触发了通知,tableview 会自动关闭一个单元格(用于显示此时触发的特定通知的单元格)。但如果我目前在 tableview 控制器中,它不会重新加载。如果我回到主视图并再次加载tableview,它将正常刷新。我希望它在通知触发后立即刷新,即使用户当前正在查看他未来的通知。 所以,如果我安排了一个通知,例如,从现在开始 1 分钟,并且我决定查看我未来的通知,我会打开该表格视图。但是,如果我在 tableview 中时本地通知触发,它不会刷新,它会说我仍然安排了该通知。要更新,我必须退出视图并再次加载 tableview 【参考方案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

    您的应用程序未运行,即未挂起,不在内存中。然后你会在-application:didFinishLaunchingWithOptions:launchOptions收到本地通知:

    UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    

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

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

【讨论】:

没有比这更好的答案了。非常感谢。

以上是关于实时重新加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章

滚动或重新加载表格视图后视图位置更改

重新加载单元格中没有图像的表格视图重新加载

iPhone / iPad 表格视图仅重新加载一行而不是整个表格

如何在表格视图中重新加载数据

如何重新加载表格视图? Xcode 11

有没有办法在重新加载表格视图数据之前添加加载视图