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

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

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

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

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

【问题讨论】:

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

标签: ios objective-c uitableview


【解决方案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];
      

      【讨论】:

      • 正如几分钟前对另一个答案的评论中所述,这已经过尝试。取消选择仍然没有动画。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多