【发布时间】:2011-07-22 01:52:28
【问题描述】:
如何仅重新加载一个单元格/行并为其设置动画? 现在我下载了一些文件。每次文件下载完成时,我称它为完成委托并调用 [tableview reload]。 但随后整个表重新加载。以及如何为表格设置动画,使其不会闪烁。例如淡入淡出效果。
问候马克斯
【问题讨论】:
标签: objective-c cocoa-touch uitableview animation
如何仅重新加载一个单元格/行并为其设置动画? 现在我下载了一些文件。每次文件下载完成时,我称它为完成委托并调用 [tableview reload]。 但随后整个表重新加载。以及如何为表格设置动画,使其不会闪烁。例如淡入淡出效果。
问候马克斯
【问题讨论】:
标签: objective-c cocoa-touch uitableview animation
使用下面的UITableView实例方法:
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
您必须指定要重新加载的NSIndexPaths 中的NSArray。如果你只是想重新加载。如果您只想重新加载一个单元格,那么您可以提供一个仅包含一个NSIndexPath 的NSArray。例如:
NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:3 inSection:0];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
您可以查看 UITableViewRowAnimation 枚举,了解所有可能的行刷新动画方式。如果您不想要任何动画,则可以使用值UITableViewRowAnimationNone,如示例中所示。
与简单地获得您想要的动画效果相比,重新加载特定的行具有更大的优势。您还可以获得巨大的性能提升,因为只有您真正需要重新加载的单元格才会刷新、重新定位和重新绘制其数据。根据单元格的复杂性,每次刷新单元格时都会产生相当大的开销,因此减少刷新次数是必要的优化,应尽可能使用。
【讨论】:
tableView 上调用reloadRowsAtIndexPaths:withRowAnimation:?
Swift 4 和 5
对于表格视图
let index = IndexPath(row: 0, section: 0)
tableView.reloadRows(at: [index], with: .automatic)
对于集合视图
let index = IndexPath(item: 2, section: 0)
collectionView.reloadItems(at: [index])
【讨论】:
如果只需要更新tableview单元格中的文字..
UITableViewCell *cell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];
cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)_targetMaxDistanceSlider.value];
【讨论】:
Apple Document 用新语法完成它
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
【讨论】:
斯威夫特
你可以使用
let selectedIndexPath = IndexPath(item:0 , section: 0)
self.tableView.reloadRows(at: [selectedIndexPath], with: .none)
为了重新加载特定的单元格。
【讨论】:
要在给定的indexPaths 处重新加载tableView 中的特定单元格,您需要创建一个indexPaths 的数组,然后在tableView 上调用函数reloadRowsAtIndexPaths。
示例如下:
斯威夫特 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];
【讨论】: