UICollectionView和UITableView的重用问题

情景

  • 今天我在做一个相册选择问题中,发现当点击第一个cell时cell中but的图片发生改变了但是继续往下滑的时候就出现了问题我只点击了一个但是 下面的cell的中btn的图片也改变了~

collectionView重用出错的效果图
  • 没有点击下面的但是 还是被勾选了 collectionView的重用出现了问题

解决方法

  • 使用一个数组 flagArr 存储所有cell的状态
  • 把indexPath.row 和这个数组flagArr 传入cell中 然后进行赋值
  • 根据点击的cell 进行判断然后给flagArr数组进行数据的更新

具体实现

  • -> viewDidLoad中
//初始化flagArr
    self.flagArr=[NSMutableArrayarray]; 
   //初始化数据源    self.dataArr=[NSMutableArrayarray];   
  for (int i=0; i<80; i++) {       
  [self.dataArraddObject:[NSStringstringWithFormat:@"%d",i]];      
  //把flagArr 的个数和数据源的个数设置成相同的      
  //而且用0初始化~也就是一开始 cell的状态全都是未选中        
    [self.flagArraddObject:@"0"];
    }
  • -> cellForRow或者cellForItem中 (第三问)
 //把indexPath.row 和 flagArr传进去
       [cell config:indexPath.row andData:self.flagArr];
  • ->cell中
-(void)config:(NSInteger)index andData:(NSMutableArray*)flagArr;
{   
 //给需要点击cell改变的状态的控件设置tag    
//为了能在外面取到  然后通过点击cell给控件改变状态和属性    
self.selectImageView.tag=8888+index;    
//赋值判断:如果在index位置的值为0  就是未被选中  1就是被选中  
  if ([flagArr[index] intValue]){     
   self.selectImageView.image=[UIImageimageNamed:@"FriendsSendsPicturesSelectBigYIcon"];   
 }else {        
  self.selectImageView.image=[UIImageimageNamed:@"FriendsSendsPicturesSelectBigNIcon"];
    }
}
  • ->控制器的 didSelected 点击cell的方法中
//一答:点击item响应的方法
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{   
 //这个是关键通过indexPath 拿到这个cell 这个方法我老师忘记    
UICollectionViewCell * cell =[collectionView cellForItemAtIndexPath:indexPath];  
  //拿到这个cell中的控件   
 UIImageView * selICon=(UIImageView *)[cell viewWithTag:8888+indexPath.row];   
 //通过indexPath。row 取到这个cell的状态 0就是未被选中,1就是已经被选中了   
 int cellFlag=[[self.flagArrobjectAtIndex:indexPath.row] intValue];    
if (cellFlag) {        
[self.flagArrsetObject:@"0"atIndexedSubscript:indexPath.row];        
selICon.image=[UIImageimageNamed:@"FriendsSendsPicturesSelectBigNIcon"];    
}else {   
    [self.flagArrsetObject:@"1"atIndexedSubscript:indexPath.row];        
selICon.image=[UIImageimageNamed:@"FriendsSendsPicturesSelectBigYIcon"];  
  }
}

现在你在运行的话UICollectionView或者UITableView的重用问题就解决了哦~~

参考Demo:GitHub

推荐阅读更多精彩内容

  • 前言 iOS里的UI控件其实没有几个,界面基本就是围绕那么几个控件灵活展开,最难的应属UICollectionVi...
    alenpaulkevin阅读 23,790评论 9 157
  • 前言 关于 iOS 10 UICollectionView的新特性,主要还是体现在如下3个方面 顺滑的滑动体验 现...
    刘宇航iOS阅读 1,015评论 1 11
  • 仿佛每过一段时间,就要这样给自己叮咛一下。偏偏自己常常口是心非,或是转头即忘,于是仍然要继续对自己训话…… 这段时...
    上官未央阅读 247评论 0 3
  • 今天,3月13日,我读到一篇文章说,:“持续写作很可能是锻炼学习能力、锻炼思考能力、锻炼分析能力、锻炼沟通能力的最...
    渌水亭阅读 95评论 2 0
  • #写在前面 #爱情里最可怕的不是分手这件事儿,而是失去了一个曾经掏心的朋友。守着一座城,往往是为了一个人,而当这座...
    一根难啃的骨头阅读 244评论 1 2