实时重新加载表格视图
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:
在这种情况下不会被调用。
所以要显示唤醒应用程序的通知,你可以在这两种情况下推送你的控制器。
【讨论】:
没有比这更好的答案了。非常感谢。以上是关于实时重新加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章