当 didDeselect 自定义单元格时,图像在 iOS 上没有改变

When didDeselect a Custom Cell the image doesn't change on iOS

我正在使用具有自定义单元格的 UITableView。 Custom Cell只有一个Label和一个UIImageUIImage将用作复选框。

所以问题是,一旦我单击一行,复选框图像就会变为一个勾选标记 png 图像(没关系)但是一旦我再次单击同一行,它就不会取消选择该行,函数 didDeselectRowAtIndexPath运行,我设置了一些 NSLogs 来检查但图像没有更改为取消选中并且背景颜色没有改变。

我觉得是因为tableview没有刷新

这里有趣的是,如果我不使用自定义单元格,我只使用 accessoryType 到 none 或复选标记(视情况而定)它会起作用。

这是 viewDidLoad 的代码,我只是初始化了一些变量:

-(void)viewDidLoad 
{
    [super viewDidLoad];

    //Let me select more than one row
    self.tableView.allowsMultipleSelection = YES;

//Used to store all the cells that were selected
      self.selectedIndexPaths = [[NSMutableArray alloc] init];

}

我有 1 个部分和 20 行(稍后它会成为一个数组,但这没问题)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    if(cell == nil)
    {
        cell = [[CustomeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }


    cell.cellNameDrinkLabel.text = @"Cell";

    if ( [self.selectedIndexPaths indexOfObject:indexPath] == NSNotFound )
    {

        cell.cellCheckboxImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"uncheckbox.png"]];

    } else
    {
        cell.cellCheckboxImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"checkbox.png"]];

    }



    return cell;
}

这是我的 didSelectRowAtIndexPath 函数:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.cellCheckboxImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"checkbox.png"]];


    if(![self.selectedIndexPaths containsObject:indexPath])
    {
        [self.selectedIndexPaths addObject:indexPath];
    }

    NSLog(@"%ld", (long)indexPath.row);

}

这里是 didDeselectRowAtIndexPath 函数(我觉得是问题所在)

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

   cell.cellCheckboxImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"uncheckbox.png"]];

    [self.selectedIndexPaths removeObject:indexPath];

    NSLog(@"%ld", (long)indexPath.row);
}

你为什么不省略

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

然后试试

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(![self.selectedIndexPaths containsObject:indexPath])
    {
        [self.selectedIndexPaths addObject:indexPath];
    }
    else
    {
        [self.selectedIndexPaths removeObject:indexPath];
    }
    [tableView reloadData];
    NSLog(@"%ld", (long)indexPath.row);
}

你可以这样做,没有必要实施- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

你可以这样试试

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CustomeCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
   if(cell == nil)
   {
       cell = [[CustomeCellTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
   }
   if([selectedPaths containsObject:indexPath])
       cell.checkMarkImage.image = [UIImage imageNamed:@"check.png"];
   else
       cell.checkMarkImage.image = [UIImage imageNamed:@"uncheck.jpg"];

return cell;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{  

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //get the custom cell
    CustomeCellTableViewCell *cell = (CustomeCellTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    if(cell)
    {
        if([selectedPaths containsObject:indexPath])
        {
           [selectedPaths removeObject:indexPath];
           cell.checkMarkImage.image = [UIImage imageNamed:@"uncheck.jpg"];
        }
        else
        {
           [selectedPaths addObject:indexPath];
           cell.checkMarkImage.image = [UIImage imageNamed:@"check.png"];
         }
   }
   //deselect the cell with animation
   [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

这对我有用,希望对你也有用。

我们可以用单一方法管理它。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    tablecell *cell = (tablecell *)[tableView cellForRowAtIndexPath:indexPath];
    UIImage *checkImage = [UIImage imageNamed:@"check.png"];
    NSData *dataCheck = UIImagePNGRepresentation(checkImage);
    NSData *dataCheckCell = UIImagePNGRepresentation(cell.img.image);
    if ([dataCheckCell isEqualToData:dataCheck]) {
        cell.img.image = [UIImage imageNamed:@"uncheck.png"];
    }
    else
    {
        cell.img.image = [UIImage imageNamed:@"check.png"];
    }
}

如果您在上面的代码中遇到问题,请告诉我。会帮你解决。