如何在didSelectRowAtIndexPath中的表视图中重新加载数据并保留选择?

时间:2015-09-23 09:12:12

标签: ios objective-c uitableview

在我的表视图控制器的didSelectRowAtIndexPath方法中出于某些原因,我应该调用表视图的reloadData。在此之后,任何选择都将消失。哪种方法可以保留表的选择?

UPD:我在selectRowAtIndexPath重新加载表后尝试didSelectRowAtIndexPath,但它没有导致任何结果,选择仍然缺失。但是如果我会在dispatch_after块中执行它会起作用,尽管这是一个非常奇怪的解决方案。我需要以正确的方式做到这一点。

5 个答案:

答案 0 :(得分:0)

重新加载发生在下一个布局过程中,这通常发生在您将控制权返回到运行循环时(例如,您的按钮操作或任何返回之后)。

因此,在表视图重新加载后运行某些东西的一种方法就是强制表视图立即执行布局:

- (void)reloadTableView
{
   NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
   [self.tableView reloadData];
   [self.tableView layoutIfNeeded];
   for (NSIndexPath *path in indexPaths) {
       [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
   }
}

或者正如您所说,您可以使用GCD安排布局后代码以便稍后运行

- (void)reloadTableView
{
   NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
   [self.tableView reloadData];
   dispatch_async(dispatch_get_main_queue(), ^{
      for (NSIndexPath *path in indexPaths) {
        [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
      }
   }
}

答案 1 :(得分:0)

-selectRowAtIndexPath内拨打animated后,将NO标记设置为[tableView reloadData],添加-didSelectRowAtIndexPath

目标-C:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [tableView reloadData];
    [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    ...
}

夫特:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    ...
    tableView.reloadData()
    tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None)
    ...
}

答案 2 :(得分:0)

你可以使用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    //add you code and reload the table

}

答案 3 :(得分:0)

在“didSelectRowAtIndexPath”委托方法中,保留所选indexPath的引用:

indexPathReference = indexPath;

重新加载表视图后,添加以下行:

[tableView selectRowAtIndexPath:indexPathReference animated:NO scrollPosition:UITableViewScrollPositionNone];

答案 4 :(得分:0)

html_safe中,您必须保留对所选indexPath的引用。 然后你应该拨打didSelectRowAtIndexPath

reloadData会触发对reloadData

的调用

这是您使用存储的indexPath检查每个索引并将单元格设置为选中的位置。 (cellForRowAtIndexPath: