tableView reloadData 和 deselectRowAtIndexPath

Posted

技术标签:

【中文标题】tableView reloadData 和 deselectRowAtIndexPath【英文标题】:tableView reloadData and deselectRowAtIndexPath 【发布时间】:2014-12-30 20:09:16 【问题描述】:

当返回-viewWillAppear:animated 中的表格视图时,我正在使用以下代码取消选择选定的表格视图单元格。

[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];

在这种情况下,我还需要重新加载表格视图的数据,但是当你这样做时,它会清除选定单元格的选定状态,因此你看不到任何淡入淡出动画。

有没有办法重新加载表格数据并保留选定状态以创建取消选择动画?

【问题讨论】:

NSUserDefaults 太重了? 见***.com/questions/6649202/… @MikeTaverne 问题不在于保持选择状态,问题在于viewWillAppear 以动画方式将其关闭,同时重新加载数据。我想出如何维护动画的唯一方法是在viewWillAppear 中重新加载表格并在viewDidAppear 中执行动画,反之亦然。 有趣,好的。我认为该帖子建议了一种在重新加载后手动选择行的技术。如果你这样做,然后用动画取消选择,那会产生你想要的效果吗? 【参考方案1】:

经过几次尝试,我发现了一些可行的方法。您需要将取消选择设置为在“延迟”(0 秒)之后发生,以确保它在下一个绘制周期发生并正确设置动画。

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;
    [self.tableView reloadData];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

    [self performSelector:@selector(deselectRow) withObject:nil afterDelay:0];



- (void)deselectRow

    [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];

【讨论】:

【参考方案2】:

在你的 viewDidLoad 中试试这个:

    [self setClearsSelectionOnViewWillAppear:NO];

【讨论】:

这在重新加载viewWillAppear 中的表格时没有帮助,因为重新加载将清除选定的单元格。【参考方案3】:

@user2970476 建议的明显解决方案似乎在 ios 7 上运行良好。对于 iOS 8,我稍微修改了 @Stonz2 的答案以使用块

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    dispatch_async(dispatch_get_main_queue(), ^(void)      // necessary for iOS 8
        [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];
    );

我还必须在 viewDidLoad 中设置 self.clearsSelectionOnViewWillAppear = NO;,因为 IB 设置被忽略了。

【讨论】:

【参考方案4】:

您需要先重新加载表格视图,选择要指示的行,然后执行取消选择动画。您遇到的问题是您的操作顺序不正确。

【讨论】:

我试过这个。我重新加载,再次设置选中的单元格(重新加载清除它)而不使用动画,然后设置未选中的动画。它没有动画。 @BerryBlue 可能是时间问题。您是否尝试在 viewDidAppear 中执行取消选择?【参考方案5】:

您可以保存当前选择

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:selectedRow animated:NO scrollPosition:UITableViewScrollPositionNone];

【讨论】:

正如几分钟前对另一个答案的评论中所述,这已经过尝试。取消选择仍然没有动画。

以上是关于tableView reloadData 和 deselectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

[tableView reloadData] 和 runloop

tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview

Swift:tableView.reloadData() 表中没有数据

tableView reloadData 和 deselectRowAtIndexPath

每次视图出现时 tableView.reloadData()

iOS TableView reloadData刷新列表cell乱跳tableview闪动的问题。