当 didDeselect 自定义单元格时,图像在 iOS 上没有改变
When didDeselect a Custom Cell the image doesn't change on iOS
我正在使用具有自定义单元格的 UITableView
。 Custom Cell只有一个Label和一个UIImage
,UIImage
将用作复选框。
所以问题是,一旦我单击一行,复选框图像就会变为一个勾选标记 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"];
}
}
如果您在上面的代码中遇到问题,请告诉我。会帮你解决。
我正在使用具有自定义单元格的 UITableView
。 Custom Cell只有一个Label和一个UIImage
,UIImage
将用作复选框。
所以问题是,一旦我单击一行,复选框图像就会变为一个勾选标记 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"];
}
}
如果您在上面的代码中遇到问题,请告诉我。会帮你解决。