記一次Cell復(fù)用BUG

沒(méi)錯(cuò),就是這個(gè)老生常談的復(fù)用問(wèn)題,又一次坑了我(上一次被坑貌似是一年多前了),痛定思痛之后決定記錄下,防止以后再犯SB。

先來(lái)看看出問(wèn)題的頁(yè)面吧:

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

嗯,就是一個(gè)月份的日歷,然后每天有不同的任務(wù)列表。

實(shí)現(xiàn)方式

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

遇到問(wèn)題

初始化日歷的數(shù)據(jù)是正常的,滑動(dòng)或者點(diǎn)擊刷新后,每日的任務(wù)數(shù)據(jù)就開(kāi)始各種錯(cuò),亂顯示了。嗯,作為一個(gè)稍有經(jīng)驗(yàn)的程序員,這個(gè)時(shí)候腦海里當(dāng)然浮現(xiàn)了兩字:復(fù)用。

我最開(kāi)始的思路是這樣的:首先外層的日歷是正確的,所以應(yīng)該不是UICollectionCell的問(wèn)題,而是嵌套在UICollectionViewCell里的的UITableView的UITableViewCell的復(fù)用(事實(shí)證明這個(gè)思路是錯(cuò)誤的)。

按照上面的思路我把內(nèi)部嵌套的UITableView的邏輯梳理了一遍之后,沒(méi)有發(fā)現(xiàn)沒(méi)問(wèn)題。

在浪費(fèi)了一段時(shí)間還沒(méi)解決問(wèn)題的情況下,我開(kāi)始審視自己最開(kāi)始的思路。

每天的任務(wù)列表數(shù)據(jù)是UICollectionCell里面進(jìn)行傳遞的:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    ZXCalendarCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    //這里是計(jì)算時(shí)間的一些操作
    NSString *currentTime = [NSString stringWithFormat:@"%@-%@-%@",array[0],array[1],str];
    
    //self.dataArray是一個(gè)月的日歷數(shù)據(jù),遍歷找到當(dāng)天然后把這一天的數(shù)據(jù)模型scheduleModel給cell,然后cell的tableView會(huì)進(jìn)行顯示
    for (ScheduleModel *model in self.dataArray) {
        if ([model.VisitTime isEqualToString:currentTime]) {
            cell.scheduleModel = model;
            break;
        }
    }
   
    //其他一些cell操作
    return cell;
}

說(shuō)真的,看了幾遍上述的代碼,仍然不覺(jué)得有什么問(wèn)題,邏輯都是通的?。。。〉?,經(jīng)驗(yàn)告訴我一定是這里出了問(wèn)題,這里傳遞數(shù)據(jù)一定是有問(wèn)題的?。。?/p>

后來(lái)腦子終于不秀逗,想明白,于是改成下面的代碼:

    //先找到當(dāng)前日期的數(shù)據(jù)
    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;
    }

問(wèn)題解決。

總結(jié)

明白的可能一上來(lái)就明白了。代碼框1里面的那種寫(xiě)法,是有未處理的cell的情況的,因此會(huì)出現(xiàn)問(wèn)題。

簡(jiǎn)單粗暴地說(shuō):所有的cell數(shù)據(jù)出亂子的問(wèn)題,不出意外都是cell的復(fù)用問(wèn)題,復(fù)用問(wèn)題不出意外的話(huà)都是在cellForItemAtIndexPath:(NSIndexPath *)indexPath 這個(gè)方法里寫(xiě)的有問(wèn)題,而不出意外的話(huà),問(wèn)題都是沒(méi)有寫(xiě)全cell的不同情況。比如寫(xiě)了if/else if 而沒(méi)有else。

題外

明天正式去Node組搬磚干活兒,以后會(huì)開(kāi)個(gè)新專(zhuān)題寫(xiě)Node,歡迎繼續(xù)專(zhuān)注。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容