iOS开发~UITableViewCell重用机制总结

相信每一个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];
    }
    //...其他代码
}
这是我目前非常喜欢使用的一种方法,暂时未遇到任何问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值