IOS关于tableView刷新指定行的一点坑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS关于tableView刷新指定行的一点坑相关的知识,希望对你有一定的参考价值。
参考技术A 需求描述:这次需求,更新完数据,由于只是改动了一行数据,本来想要节省性能,不刷新全部,使用了- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation API_AVAILABLE(ios(3.0));这个方法
坑:
这个方法在cell复用的太多的时候,会出现卡顿的现象,就是说,有时候cell会先变成灰色,然后再刷新
解决方法:
没别的好方法,老老实实用reloadData
iOS - 向下滚动时tableview禁用刷新
【中文标题】iOS - 向下滚动时tableview禁用刷新【英文标题】:iOS - tableview disable refreshing when scrolling down 【发布时间】:2012-09-08 16:48:27 【问题描述】:我正在制作一个简单的“添加到收藏夹”功能,它是一个 UITableViewController。当用户选择一个单元格时,我将color
设置为灰色并禁用selectionStyle
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.textColor = [UIColor grayColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
我的第一个问题是,每次我选择一个单元格时,其他一些单元格也会切换颜色。所以我删除了以下代码以防止这种情况发生:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
但是我仍然有一个奇怪的问题:在向下滚动 tableview 然后回到它的顶部后,我注意到我选择的所有单元格都恢复了默认颜色,并且最后选择的单元格被突出显示蓝色。
所以我可能错了,但我假设滚动时表格视图正在刷新,我想禁用此行为。
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:你不会想要禁用 UITableViewController 提供的最重要的功能,因为这个删除/创建技巧给你可能想要的快速滚动。
一旦单元格离开屏幕(取决于 tableviewcontroller 行高),它们就会被释放(从内存中删除)。如果它是一个传入的单元格(从屏幕外部),它将在 cellForRowAtIndexPath (creation) 方法中相应地创建。
您可能希望使用DataSource
来创建和保存状态,这样它就不会失去其属性。
或者试试这个
UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];
【讨论】:
【参考方案2】:您缺少对 UITableView 呈现其子视图 (UITableViewCells) 方式的基本理解。我建议阅读UITableView programming guide。 永远不要删除表格视图上的dequeueReusableCellWithIdentifier
调用,这对性能非常重要。
对于您的问题:您需要跟踪每个单元格的状态,并在 cellForRowAtIndexPath: 中设置选择状态,UITableView 尽可能重用单元格,并在单元格在屏幕上和滚动时刷新。
一个非常简单的实现是:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (![self.selectedRows containsObject:indexPath])
[self.selectedRows addObject:indexPath];
else
[self.selectedRows removeObject:indexPath];
[tableView reloadRowsAtIndexPaths:@[indexPath]];
在 cellForRow 中
if ([self.selectedRows containsObject:indexPath])
cell.textLabel.textColor = [UIColor grayColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
else
//set the normal cells values
【讨论】:
【参考方案3】:为了提高效率,表格单元格会在单元格滚动离开屏幕时重复使用。这是正常的和期望的。随它去吧,不要试图打败它。
您需要跟踪在单元格本身以外的其他位置选择的行,因为当它滚出屏幕时这些行会丢失。我建议在您的视图控制器中创建一个属性,例如一个 NSNumbers 数组,它们是 BOOL。选中单元格后,将对应行的bool设置为true,即可更改单元格的文字颜色。
当一个单元格出列时,您需要根据您的数组设置它的颜色。这将确保您的单元格在屏幕上下滚动时具有正确的颜色。
【讨论】:
以上是关于IOS关于tableView刷新指定行的一点坑的主要内容,如果未能解决你的问题,请参考以下文章