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

时间:2011-06-24 01:27:18

标签: cocoa-touch uitableview reloaddata

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

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

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

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

2 个答案:

答案 0 :(得分:8)

重新加载单元格时,会自动取消选择。这是因为您未在selected中将单元格的YES属性设置为tableView:cellForRowAtIndexPath:。所以你必须以不同的方式处理这个问题。确定indexPath处的单元格需要selected并在selected中将YES属性设置为tableView:cellForRowAtIndexPath:,或者在重新加载数据后选择它。在这种情况下,您可以执行以下方法 -

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

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

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

步骤的顺序是: -

  1. 在没有任何动画的情况下重新加载行。
  2. 选择没有动画的行。
  3. 取消选择带动画的行。
  4. 这样我觉得你可以得到你想要的效果。

答案 1 :(得分:0)

当用户第一次点击行加载可编辑视图控制器时,在加载可编辑的ViewController之前取消选择UITableViewCell。