如何仅对一个UITableView单元/行重新加载和设置动画?


72

如何仅对一个单元格/行进行重新加载和动画处理?现在我下载一些文件。每次文件下载完成时,我称其为完成的委托,然后调用[tableview reload]。但是随后整个表重新加载。以及如何为表格设置动画,使其不会闪烁。例如淡入淡出效果。

问候麦克斯

Answers:


188

使用以下UITableView实例方法:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

你必须指定NSArrayNSIndexPaths要重装。如果只是想重新加载。如果您只想重新加载一个单元,则可以提供NSArray仅容纳一个的单元NSIndexPath。例如:

NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:3 inSection:0];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

您可以看到UITableViewRowAnimation为行刷新设置动画的所有可能方式的枚举。如果您不需要任何动画,则可以使用value UITableViewRowAnimationNone,如示例中所示。

重新加载特定的行比仅获得所需的动画效果具有更大的优势。您还可以极大地提高性能,因为只有真正需要重新加载的单元才可以刷新,重新定位和重绘数据。根据单元的复杂程度,每次刷新单元都会有相当大的开销,因此缩小刷新量是必须尽可能使用的必要优化。


17
使用新语法,您还可以执行以下操作:[UITableView reloadRowsAtIndexPaths:@ [indexPath] withRowAnimation:UITableViewRowAnimationNone];
bbrame

@JamesBedford重新加载单个单元格。是否需要在-(void)reloadRowsAtIndexPaths方法中编写一些内容?
Warewolf

reloadRowsAtIndexPaths:withRowAnimation:方法是UITableView的一种方法,可用于重新加载单个单元格(只需将单个单元格索引路径作为参数传递!)
James Bedford

我如何从单元本身做到这一点?我有一个带有按钮的单元格视图子类,当我单击该按钮时,我想从内部更新单元格,而不必在表视图控制器中进行处理。我可以做吗?
NunoGonçalves2015年

您是否尝试过让单元格具有对表视图控制器的引用,然后仅调用reloadRowsAtIndexPaths:withRowAnimation:tableView
詹姆斯·贝德福德

6

如果只需要更新tableview单元格中的文本。

UITableViewCell *cell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)_targetMaxDistanceSlider.value];

借助此功能,RTT实施无需重新加载整个视图,而只需重新加载文本即可。
扎克·马修斯

很好的答案。
iOS

6

斯威夫特4&5

对于TableView

let index = IndexPath(row: 0, section: 0)
tableView.reloadRows(at: [index], with: .automatic)

对于CollectionView

let index = IndexPath(item: 2, section: 0)
collectionView.reloadItems(at: [index])



0

要在tableViewat中重新加载特定单元格indexPaths,您需要创建的数组indexPaths然后reloadRowsAtIndexPaths在上调用函数tableView

这是示例:

斯威夫特5:

let indexPathsToReload = [indexPath1, indexPath2, indexPath3]
tableView.reloadRows(at: indexPathsToReload, with: .none)

目标C:

NSArray *indexPaths = @[indexPath1, indexPath2, indexPath3];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

要么

NSArray *indexPaths = [NSArray arraywithobject:@"indexPath1", @"indexPath2", @"indexPath3",nil];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.