是否有可能刷新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:]
,但没有奏效。 但是,下面的例子适用于我。 我alloc
和release
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()
键盘消失