记一次Cell复用BUG

作者: 啃手高手 | 来源:发表于2016-11-14 19:30 被阅读325次

    没错,就是这个老生常谈的复用问题,又一次坑了我(上一次被坑貌似是一年多前了),痛定思痛之后决定记录下,防止以后再犯SB。

    先来看看出问题的页面吧:

    0E325E80-45D9-48B3-A658-45F44ECCEB85.png

    嗯,就是一个月份的日历,然后每天有不同的任务列表。

    实现方式

    日历自然是用UICollectionView ,然后UICollectionViewCell里面嵌套了UITableView。

    遇到问题

    初始化日历的数据是正常的,滑动或者点击刷新后,每日的任务数据就开始各种错,乱显示了。嗯,作为一个稍有经验的程序员,这个时候脑海里当然浮现了两字:复用

    我最开始的思路是这样的:首先外层的日历是正确的,所以应该不是UICollectionCell的问题,而是嵌套在UICollectionViewCell里的的UITableView的UITableViewCell的复用(事实证明这个思路是错误的)。

    按照上面的思路我把内部嵌套的UITableView的逻辑梳理了一遍之后,没有发现没问题。

    在浪费了一段时间还没解决问题的情况下,我开始审视自己最开始的思路。

    每天的任务列表数据是UICollectionCell里面进行传递的:

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        
        ZXCalendarCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
        //这里是计算时间的一些操作
        NSString *currentTime = [NSString stringWithFormat:@"%@-%@-%@",array[0],array[1],str];
        
        //self.dataArray是一个月的日历数据,遍历找到当天然后把这一天的数据模型scheduleModel给cell,然后cell的tableView会进行显示
        for (ScheduleModel *model in self.dataArray) {
            if ([model.VisitTime isEqualToString:currentTime]) {
                cell.scheduleModel = model;
                break;
            }
        }
       
        //其他一些cell操作
        return cell;
    }
    

    说真的,看了几遍上述的代码,仍然不觉得有什么问题,逻辑都是通的啊!!!但是,经验告诉我一定是这里出了问题,这里传递数据一定是有问题的!!!

    后来脑子终于不秀逗,想明白,于是改成下面的代码:

        //先找到当前日期的数据
        ScheduleModel *currentModel;
        BOOL hasData = NO;
        for (ScheduleModel *model in self.dataArray) {
            if ([model.VisitTime isEqualToString:currentTime]) {
                currentModel = model;
                hasData = YES;
                break;
            }
        }
        //然后给cell赋值
        if (hasData) {
            cell.scheduleModel = currentModel;
        }else{
            cell.scheduleModel = nil;
        }
    

    问题解决。

    总结

    明白的可能一上来就明白了。代码框1里面的那种写法,是有未处理的cell的情况的,因此会出现问题。

    简单粗暴地说:所有的cell数据出乱子的问题,不出意外都是cell的复用问题,复用问题不出意外的话都是在cellForItemAtIndexPath:(NSIndexPath *)indexPath 这个方法里写的有问题,而不出意外的话,问题都是没有写全cell的不同情况。比如写了if/else if 而没有else。

    题外

    明天正式去Node组搬砖干活儿,以后会开个新专题写Node,欢迎继续专注。

    相关文章

      网友评论

        本文标题:记一次Cell复用BUG

        本文链接:https://www.haomeiwen.com/subject/auzhpttx.html