如何在CollectionView中选择单个单元格并取消选择所有其他单元格

时间:2017-03-04 06:08:14

标签: ios objective-c uicollectionview uicollectionviewcell

**

  

我有水平CollectionView,其中所选单元格为橙色   渐变颜色和所有其他取消选择的单元格灰色i m   仅使用didselect委托方法,但我遇到的问题   选择了多个单元格,我在表格中遇到了相同的概念问题   滚动时查看,我搜索了很多,但我没有得到   正确回答细胞可重用性

**

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{


    DateTimeCell * cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"DateTimeCellID" forIndexPath:indexPath];



    if (self.selectedIndexPath != nil && indexPath == self.selectedIndexPath)
    {

        CAGradientLayer *gradient = [CAGradientLayer layer];
        gradient.frame = cell.mainView.bounds;
        gradient.startPoint = CGPointZero;

        gradient.endPoint = CGPointMake(1, 1);
        gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:238.0/255.0 green:42.0/255.0 blue:123/255.0 alpha:1.0] CGColor],(id)[[UIColor colorWithRed:241.0/255.0 green:90.0/255.0 blue:41.0/255.0 alpha:1.0] CGColor], nil];
        [gradient setMasksToBounds:NO];
        cell.mainView.backgroundColor = [UIColor clearColor];
        [cell.mainView.layer insertSublayer:gradient atIndex:0];

        [indexPaths addObject:self.selectedIndexPath];

    }
     else
     {
         [cell.mainView setBackgroundColor:[self colorWithHexString:@"383F4A"]];
      }

    return cell;
}

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{


    indexPaths = [NSMutableArray arrayWithObjects:indexPath, nil];

    if (self.selectedIndexPath)
    {
        // if we had a previously selected cell

        if ([indexPath compare:self.selectedIndexPath] == NSOrderedSame)
        {
            // if it's the same as the one we just tapped on, then we're unselecting it

            NSLog(@"Selected");

        }
        else
        {
            // if it's different, then add that old one to our list of cells to reload, and
            // save the currently selected indexPath

            [indexPaths addObject:self.selectedIndexPath];
            self.selectedIndexPath = indexPath;
        }
    }
    else
    {
        // else, we didn't have previously selected cell, so we only need to save this indexPath for future reference

        self.selectedIndexPath = indexPath;

    }



    dispatch_async(dispatch_get_main_queue(), ^{
         [collectionView reloadItemsAtIndexPaths:indexPaths];
    });


}

1 个答案:

答案 0 :(得分:1)

将全局selectedIndexPath全局视为下面的

NSIndexPath *selectedIndexPath = [[NSIndexPath alloc] indexPathForRow:0 inSection:0];

在代理方法中的代码下面写错误

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{


DateTimeCell * cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"DateTimeCellID" forIndexPath:indexPath];

if self.selectedIndexPath == indexPath
{
  // do what you want to do with your selected cell
}
else
{
    // do what you want to do with your deselected cell
}


return cell;
}

 -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

self.selectedIndexPath = indexPath
[self.collectionView reloadData];


 }
相关问题