是否有可能刷新UITableView中的单个UITableViewCell?

我有一个使用UITableViewCell自定义的UITableView 。 每个UITableViewCell有2个button。 单击这些button将更改单元格内的UIImageView的图像。

是否可以单独刷新每个单元格以显示新图像? 任何帮助表示赞赏。

一旦你有你的单元格的indexPath,你可以做这样的事情:

 [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; 

在Xcode 4.6及更高版本中:

 [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; 

当然,你可以设置任何你喜欢的animation效果。

我试着只是调用-[UITableView cellForRowAtIndexPath:] ,但没有奏效。 但是,下面的例子适用于我。 我allocrelease NSArray进行严格的内存pipe理。

 - (void)reloadRow0Section0 { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [indexPaths release]; } 

reloadRowsAtIndexPaths:很好,但仍然会强制UITableViewDelegate方法触发。

我能想到的最简单的方法是:

 UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [self configureCell:cell forIndexPath:indexPath]; 

在主线程上调用configureCell:实现非常重要 ,因为它不会在非UI线程上工作 (与reloadData / reloadRowsAtIndexPaths:相同的故事)。 有时添加以下内容可能会有帮助:

 dispatch_async(dispatch_get_main_queue(), ^ { [self configureCell:cell forIndexPath:indexPath]; }); 

避免在当前可见视图之外完成的工作也是值得的:

 BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound; if (cellIsVisible) { .... } 

迅速:

 func updateCell(path:Int){ let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates() } 

如果您正在使用自定义TableViewCells,generics

 [self.tableView reloadData]; 

没有有效地回答这个问题, 除非你离开现在的观点并回来。 第一个答案也没有。

要成功地重新加载您的第一个表视图单元格而不切换视图 ,请使用以下代码:

 //For iOS 5 and later - (void)reloadTopCell { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; } 

插入以下刷新方法 ,调用上述方法,以便您可以自定义仅重新加载顶部单元格(如果您愿意,也可以整个表格视图):

 - (void)refresh:(UIRefreshControl *)refreshControl { //call to the method which will perform the function [self reloadTopCell]; //finish refreshing [refreshControl endRefreshing]; } 

现在你已经有了这个sorting,在你的viewDidLoad添加以下内容:

 //refresh table view UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:refreshControl]; 

您现在有一个自定义刷新表function,将重新加载顶部单元格。 要重新加载整个表格,请添加

[self.tableView reloadData]; 到你的新刷新方法。

如果您希望每次切换视图时重新加载数据,请执行以下方法:

 //ensure that it reloads the table view data when switching to this view - (void) viewWillAppear:(BOOL)animated { [self.tableView reloadData]; } 

只要在iOS 6中用新的文字语法稍微更新这些答案 – 您可以对单个对象使用Paths = @ [indexPath],对于多个对象可以使用Paths = @ [indexPath1,indexPath2,…]。

就我个人而言,我发现数组和字典的字面语法是非常有用的和大量的时间储存器。 首先,阅读起来更容易一些。 它消除了在任何多对象列表的末尾都是零的需要,这一直是一个个人的bugaboo。 我们都有我们的风车倾斜,是吗? 😉

只是以为我会把这个混在一起。 希望它有帮助。

Swift 3:

 tableView.beginUpdates() tableView.reloadRows(at: [indexPath], with: .automatic) tableView.endUpdates() 

我需要升级单元,但是我想closures键盘。 如果我使用

 let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates() 

键盘消失