- 總感覺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方法。
- 很多人將cell 復(fù)用出來之后 remove cell 中的subviews 。然后再添加子視圖。
- 還有就是記錄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 一個,給個連接。。謝謝
---來自濤胖子的工作筆記