iOS UITableViewCell的重用机制出现问题解决

在iOS 开发中 有很大一部分的页面是用UITableView实现的,学会学好UITableView至关重要,一定要深入理解UITableView应用和重用机制,本篇文章主要介绍UITableView的重用。

先强调几点我平时实现UITableView遵从的原则:

1.在一个页面中相同的cell尽量可重用,不同的cell不要重用(分开写)。

2.一个页面都是相同的cell单元格,控件又比较多尽量新建一个类继承自UITableViewCell,一个页面是用UITableView实现的,但是每一个cell都不相同,可以考虑在 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{} 

方法中直接实现,但是要注意在这种情况下就不要用UITableView的重用机制了(重用机制还是可以实现的,但是每一个indexPath.row 分开写),要注意每一个cell的高度。

在实现UITableView的时候有时候我们用UITableView的重用机制出现视图叠加,这就是UITableView的重用出现问题了,解决的办法有三种:

1.不使用UITableView的重用机制,实现代码如下:

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

这种方法要创建好多cell严重消耗内存,不推荐使用。

2.使用UITableView的重用机制,但是给每个cell的id不一样,代码如下:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"cellId%li",indexPath.row]];

这种方法虽然用了UITableView的重用机制,但是也要创建好多cell,与方法一差不多,也不推荐使用。

3.使用UITableView的重用机制,但是在每次cell不为空的情况下移除子视图,代码如下:

    static NSString *cellId = @"cellId"

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

    if (!cell) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }else{

        // 判断cell.contentView如果有子视图则移除

        while ([cell.contentView.subviews lastObject] != nil) { 

            [[cell.contentView.subviews lastObject] removeFromSuperview];

        }

/**

// 这种方法也可以,这是OC提供的枚举,二者选其一就好,实现效果是一样的

[cell.contentView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

            UIView *view = (UIView *)obj;

            [view removeFromSuperview];

        }];

*/

        

    }


这种情况适合用了UITableView的重用机制,出现视图或是文字重叠,就可用这种方法,推荐使用。

必须根据自己的业务逻辑和代码实现判断是否使用,如果使用错误会造成已经创建的视图被移除。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值