重新加载表格并清除单元格行选择

Posted

技术标签:

【中文标题】重新加载表格并清除单元格行选择【英文标题】:Reloading Table and Clearing Cell Row Selection 【发布时间】:2014-11-03 18:53:59 【问题描述】:

直到 ios 8 和 Xcode 6,我都能够使用 UITableViewController 来配置我的应用程序,就像 Apple 的设置一样。在从一个表返回调用表时,我会重新加载调用表以更新单元格中的数据,重新选择调用行,然后让视图显示为动画以清除选择。

这是我一直在使用的 viewWillAppear 方法中的代码:

[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:lastselected animated:YES scrollPosition:UITableViewScrollPositionNone];
[super viewWillAppear:animated];

当单元格数据更新时,所选行/单元格的缓慢消失不会发生。它立即被有效清除。我已经尝试了几乎所有我能想到的并且无法使其正常工作。请帮忙...

发生了什么变化,我怎样才能恢复这种良好的过渡?

谢谢。

【问题讨论】:

【参考方案1】:

viewWillAppear 在您的视图出现在屏幕上之前被调用。因此,如果从该方法内部触发,您将无法使任何动画正常工作。改用viewDidAppear,您应该会看到更可靠的过渡动画。如果您觉得它发生得太快,也可以延迟使用performSelector

就个人而言,在这种情况下,我会先致电[super viewDidAppear:animated];。我看不出它低于其他代码行的原因。

还只是为了让我 100% 清楚...viewWillAppear 显然可以重新加载 tableView,所以让我们这样做...

-(void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];
    [self.tableView reloadData];



-(void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    [self.tableView selectRowAtIndexPath:lastSelected animated:YES scrollPosition:UITableViewScrollPositionNone];

或者在 viewDidAppear 上执行选择器延迟...

-(void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    [self performSelector:@selector(animateCellSelectionAtIndexPath:) withObject:lastSelected afterDelay:0.2f];


-(void)animateCellSelectionAtIndexPath:(NSIndexPath *)indexPath

     [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];

【讨论】:

谢谢。这实际上并没有像你计划的那样有帮助,但我可以通过这样做来让它工作: -(void)viewWillAppear: (BOOL)animated [self.tableView reloadData]; [self.tableView selectRowAtIndexPath:lastselected animated:YES scrollPosition:UITableViewScrollPositionNone]; [self performSelector:@selector(animateCellSelectionAtIndexPath:) withObject:lastselected afterDelay:0.05f]; -(void)animateCellSelectionAtIndexPath:(NSIndexPath *)indexPath [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 在您的评论代码中,您执行了两次selectRowAtIndexPath 调用。您不应该只需要第一个selectRowAtIndexPath,而只需要延迟执行选择器中的那个。如果我的 viewDidAppear 版本不起作用,我会感到非常惊讶,尽管我很高兴这种情况下的延迟为你解决了......正如我所说,你不能保证这一点,因为从技术上讲它是一个不确定的数量在它“确实出现”之前的时间。 很好。它实际上是一个 deselectRowAtIndexPath 而不是另一个选择。复制/粘贴错误。

以上是关于重新加载表格并清除单元格行选择的主要内容,如果未能解决你的问题,请参考以下文章

重新加载表视图数据并取消选择单元格

如果超过 indexpath.row,如何在表格视图中设置单元格行高?

重新加载 UITableView 数据并向下滚动到最后选择的单元格

一次加载 10 个单元格行 - 快速

elementuitable左右固定如何调整每个单元格行高

EXCEL设置单元格颜色