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

嗯,就是一個(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)注。