【问题标题】:Reload table view in real time实时重新加载表格视图
【发布时间】:2023-03-13 21:04:01
【问题描述】:

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

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

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

什么是更好的解决方案?

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

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

【问题讨论】:

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

标签: ios uitableview uilocalnotification reloaddata


【解决方案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. 您的应用程序未运行,即未挂起,不在内存中。然后你会在-application:didFinishLaunchingWithOptions:launchOptions收到本地通知:

    UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    

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

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

【讨论】:

  • 没有比这更好的答案了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多