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