是否可以在 UITableView 中刷新单个 UITableViewCell?

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

是否可以分别刷新每个单元格以显示新图像? 感谢你的帮助。

161730 次浏览

一旦有了单元格的 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];

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

我试着给 -[UITableView cellForRowAtIndexPath:]打电话,但是没用。但是,下面的例子对我很有用。I allocreleaseNSArray紧密内存管理。

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

只需要用 iOS 6中新的文本语法稍微更新一下这些答案——您可以对单个对象使用 Path =@[ indexPath ] ,或者对多个对象使用 Path =@[ indexPath1,indexPath2,... ]。

就我个人而言,我发现数组和字典的字面语法非常有用,而且大大节省了时间。首先,它更容易阅读。并且它消除了在任何多对象列表的末尾都需要一个 nil 的情况,这一直是个个人问题。我们都有自己的风车,不是吗?;-)

我只是想把这个加进去,希望能有帮助。

如果使用自定义 TableViewCell,则泛型

[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];
}

现在已经排序好了,在 viewDidLoad中添加以下内容:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];


[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];


[self.tableView addSubview:refreshControl];

现在有了一个自定义刷新表特性,它将重新加载顶部单元格。若要重新加载整个表,请添加

[self.tableView reloadData];设置为新的刷新方法。

如果希望在每次切换视图时重新加载数据,请实现该方法:

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

斯威夫特:

func updateCell(path:Int){
let indexPath = NSIndexPath(forRow: path, inSection: 1)


tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
}

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)
{
....
}

斯威夫特3:

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

我需要升级单元格,但我想关闭键盘。 如果我用

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

键盘消失了

这是一个带有 Swift 5的 UITableView 扩展:

import UIKit


extension UITableView
{
func updateRow(row: Int, section: Int = 0)
{
let indexPath = IndexPath(row: row, section: section)
        

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

}

打电话给

self.tableView.updateRow(row: 1)