为什么我不能在viewWillAppear中调用reloadData和deselectRowAtIndexPath:同时进行动画处理?

Mat*_*ler 2 cocoa-touch uitableview reloaddata

我有一个带有单元格的UITableView,可以在选中时将viewControllers推送到堆栈.子视图控制器接受用户输入,然后弹出堆栈.

当弹出子viewController时,我希望父tableView更新所选单元格的值,然后取消选择该行.我可以使用reloadData更新单元格,我可以使用deselectRowAtIndexPath取消选择该行 - 但我不能同时执行这两个操作.

我理解为什么这是 - reloadData隐式取消选择单元格,deselectRowAtIndexPath明确地取消选择它,但我发现很奇怪我找不到任何想要实现相同重载/取消选择行为的人.我在这里错过了什么?

所有代码都在viewWillAppear:animated中 - 如果我在viewWillAppear中放置deselectRowAtIndexPath并在viewDidAppear中放入reloadData,我可以接近,但这不是我想要的.

Dee*_*olu 8

重新加载单元格时,会自动取消选择.那是因为你没有将单元格的selected属性设置YEStableView:cellForRowAtIndexPath:.所以你必须以不同的方式处理这个问题.无论是确定在电池indexPath的需求是selected和适当的设置selected属性YEStableView:cellForRowAtIndexPath:或选择它重新载入数据之后.在这种情况下,您可以执行以下方法 -

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                      withRowAnimation:UITableViewRowAnimationNone];

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

[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
Run Code Online (Sandbox Code Playgroud)

步骤顺序如下: -

  1. 没有任何动画重新加载行.
  2. 选择没有动画的行.
  3. 取消选择带动画的行.

这样我觉得你可以得到你想要的效果.