iOS collectionview 中cell 的復(fù)用導(dǎo)致控件屬性改變或數(shù)據(jù)錯亂

  • 總感覺collectionview的復(fù)用沒有 tableView的復(fù)用給力。最近遇到一個復(fù)用后控件屬性改變的問題。也許是我太菜吧。

就我項(xiàng)目中遇到的問題:
項(xiàng)目中是在cell 上面添加了播放器,有很多btn ,和progress 。當(dāng)你操作這些btn 之后。點(diǎn)擊其他cell 的btn 就會出現(xiàn)btn 點(diǎn)一次但是點(diǎn)擊事件執(zhí)行了很多次的情況。progress 當(dāng)然也跟著之前的cell 的進(jìn)度一樣了。。很是惡心。我第一時間想到時復(fù)用的問題。那要怎么解決呢??戳丝创罄袀兊慕鉀Q方法。

  1. 很多人將cell 復(fù)用出來之后 remove cell 中的subviews 。然后再添加子視圖。
  2. 還有就是記錄cell 的index 來作為cell 的復(fù)用標(biāo)識。

最后我選擇了第二種方式去解決這個問題。當(dāng)然第二種方式其實(shí)是沒有復(fù)用cell,如果數(shù)據(jù)量大的話估計(jì)會出問題,慎用。因?yàn)槲业臄?shù)據(jù)少所以用了這種方式,影響不大。

首先我們來看看第一種方式的寫法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
     NewTravelMediaCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
     for (id subView in cell.contentView.subviews) {
        if (subView){
            [subView removeFromSuperview];
        }
     }
    // cell 復(fù)用出來了。。這個cell 白白凈凈。接下來你想干嘛就干嘛
    // 如同上面我們所說的,cell 復(fù)用出來之后將子視圖移除掉。再添加新的視圖。這個方法我沒試過,因?yàn)槲抑熬妥远x好了cell 而且太多控件就沒有去這樣搞。
}

第二種方法代碼:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    NSString *identifier = [self.cellIdentifyDic objectForKey:[NSString stringWithFormat:@"%@", indexPath]];
    if (identifier == nil) {
        identifier = [NSString stringWithFormat:@"NewTravelMediaCell%@", [NSString stringWithFormat:@"%@", indexPath]];
        [self.cellIdentifyDic setValue:identifier forKey:[NSString stringWithFormat:@"%@", indexPath]];
        // 注冊Cell***************這里一定要注意一個問題,那就是你的cell 有沒有用xib創(chuàng)建
        // 如果你是代碼寫的cell那么注冊用下面的方法
        [collectionView registerClass:[NewTravelMediaCell class] forCellWithReuseIdentifier:identifier];
        // 如果你是用xib 拖的一定要用下面的方法..很重要。很重要。很重要,不然cell出不來
        [collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([NewTravelMediaCell class]) bundle:nil] forCellWithReuseIdentifier:identifier];
    }
    
    NewTravelMediaCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    // 這樣出來的cell 他的標(biāo)識都是唯一的。所以解決了復(fù)用會出錯的問題。

    [cell configCellWithDataModel:self.mediaDataArr[indexPath.row]];
    cell.delegate = self;
    cell.index = indexPath.row;
    
    return cell;
}

OK。媽媽再也不用擔(dān)心復(fù)用cell 會出現(xiàn)數(shù)據(jù)錯亂和控件屬性被改變的情況了。
如果有更好的方法,麻煩mark 一個,給個連接。。謝謝

---來自濤胖子的工作筆記

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

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,214評論 8 265
  • 2017.02.22 可以練習(xí),每當(dāng)這個時候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,490評論 0 1
  • 你總要有幾天心心念念的失了眠 還要強(qiáng)撐著 不與任何人聊天 讓黑暗熬盡最后一口煙 悶在肺里 繼續(xù)著你的心心念念收起
    柏零落閱讀 238評論 0 2
  • Activity生命周期分為正常創(chuàng)建和銷毀路徑和異常銷毀路徑。 正常路徑主要回調(diào)7個回調(diào)函數(shù)。其中onCreate...
    井邊呱閱讀 367評論 0 1

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