我使用UITableView
进行自定义UITableViewCell
。
每个UITableViewCell
都有2个按钮。单击这些按钮将更改单元格内UIImageView
的图像。
是否可以单独刷新每个单元格以显示新图像? 任何帮助表示赞赏。
答案 0 :(得分:317)
获得单元格的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];
当然,你可以设置你喜欢的动画效果。
答案 1 :(得分:33)
我尝试过调用-[UITableView cellForRowAtIndexPath:]
,但这不起作用。但是,以下内容适用于我。我alloc
和release
NSArray
用于严密的内存管理。
- (void)reloadRow0Section0 {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
[indexPaths release];
}
答案 2 :(得分:19)
夫特:
func updateCell(path:Int){
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
}
答案 3 :(得分:18)
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)
{
....
}
答案 4 :(得分:16)
如果您使用自定义TableViewCells,则使用通用
[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];
}
答案 5 :(得分:6)
斯威夫特3:
tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
答案 6 :(得分:4)
只是使用iOS 6中的新文字语法稍微更新这些答案 - 您可以对单个对象使用Paths = @ [indexPath],或者为多个对象使用Paths = @ [indexPath1,indexPath2,...]。
就个人而言,我发现数组和字典的字面语法非常有用并且节省了大量时间。一方面,它更容易阅读。并且它消除了在任何多对象列表的末尾需要nil,这一直是个人的bugaboo。我们都有风车倾斜,是吗? ; - )
以为我会把它扔进去。希望它有所帮助。
答案 7 :(得分:1)
这是带有Swift 5的UITableView扩展:
^abc(.|\n|\r)*xyz$
致电
import UIKit
extension UITableView
{
func updateRow(row: Int, section: Int = 0)
{
let indexPath = IndexPath(row: row, section: section)
self.beginUpdates()
self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
self.endUpdates()
}
}
答案 8 :(得分:0)
我需要升级单元,但我想要关闭键盘。 如果我使用
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
键盘消失