相信每一个iOS开发者都会遇到UITableViewCell重用数据混乱问题。
UITableViewCell重用机制问题——在界面中用到了cell,并且在cell上显示不同内容,在滑动显示过程中,出现了内容重叠的问题。
网上对于cell重用问题也有许多解决方案,大致分为三种:
1.禁用重用机制——重用机制调用的是 dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的Cell”,因此只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,但会浪费一些空间。——这种方法虽然解决了数据混乱的问题(数据不再重叠显示),但是当点击cell上按钮进行改变某一cell上label的字体颜色和内容时,进行滑动后,你会发现,改变的cell上label字体颜色改变了,但是内容却变回改变之前的内容,而且其他的cell上label的字体颜色也会随机进行改变,所以不建议使用;
2.使用不用的标识符——为每个cell指定不同的重用标识符(reuseIdentifier)来解决。重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier = [NSString stringWithFormat:@"cell%d%d", [indexPath section], [indexPath row]];//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
//...其他代码
}
这个方法相信我不说也能看的出来,对内存空间浪费非常严重。而且经过我验证,这种方法与侧滑删除共同使用的时候,会出现如下效果:如果有100个cell,如果删除掉一个cell,无论你删除的是哪个cell,经过reload之后,你会发现,删除的是最后一个cell,而非你删除的那个cell。因为cellIdentifier = [NSString stringWithFormat:@"cell%d%d", indexPath.section, indexPath.row],所以并不推荐使用
3.删除重用cell的所有子视图——这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell,供其他cell重用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
else
{
//删除cell的所有子视图
cell = nil;
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
//...其他代码
}
这是我目前非常喜欢使用的一种方法,暂时未遇到任何问题