tableView reloadData和deselectRowAtIndexPath

时间:2014-12-30 20:09:16

标签: ios objective-c uitableview

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

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

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

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

5 个答案:

答案 0 :(得分:4)

经过多次尝试,我发现了一些有效的方法。您需要将取消选择设置为在"延迟"之后发生。 (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];
}

答案 1 :(得分:1)

在viewDidLoad中尝试此操作:

    [self setClearsSelectionOnViewWillAppear:NO];

答案 2 :(得分:1)

@ 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];
    });
}

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用

保存当前选择
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:selectedRow animated:NO scrollPosition:UITableViewScrollPositionNone];