我有一个需要自定义UITableViewCellAccessoryCheckmark的表视图。选中行时会显示复选标记,选择另一行时会显示复选标记,然后显示在最后选择的最后一个视图上。这很好。
当我使用这一行时出现问题:
cell.accessoryView = [[ UIImageView alloc ]
initWithImage:[UIImage imageNamed:@"icon-tick.png" ]];
添加自定义UITableViewCellAccessoryCheckmark。在该代码之后,UITableViewCellAccessoryCheckmark保留在所有行上,并且在触摸另一行时不会消失。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
int index = indexPath.row; id obj = [listOfItems objectAtIndex:index];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%d",indexPath.row);
if (rowNO!=indexPath.row) {
rowNO=indexPath.row;
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
cell.accessoryView = [[ UIImageView alloc ]
initWithImage:[UIImage imageNamed:@"icon-tick.png" ]];
[self.tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone;
lastIndexPth=indexPath;
}
答案 0 :(得分:8)
更清洁,更酷的方式是覆盖UITableViewCell,如下所示:
- (void)setAccessoryType:(UITableViewCellAccessoryType)accessoryType
{
// Check for the checkmark
if (accessoryType == UITableViewCellAccessoryCheckmark)
{
// Add the image
self.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"YourImage.png"]] autorelease];
}
// We don't have to modify the accessory
else
{
[super setAccessoryType:accessoryType];
}
}
如果您已完成此操作,则可以继续使用UITableViewCellAccessoryCheckmark
,因为您的课程会自动将其替换为图片。
您应该只在cellForRowAtIndexPath
方法中设置样式。像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// [init subclassed cell here, dont forget to use the table view cache...]
cell.accessoryType = (rowNO != indexPath.row ? nil : UITableViewCellAccessoryCheckmark);
return cell;
}
然后,您只需更新rowNO
中的didSelectRowAtIndexPath
即可更新您的数据并重新绘制单元格,如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (rowNO != indexPath.row)
{
rowNO = indexPath.row;
}
[self.tableView reloadData];
}
此外,您不能使用[self.tableView reloadData]
重新加载整个表格,而只能使用reloadRowsAtIndexPaths
重新加载更改其样式的两个单元格(例如复选标记)。
答案 1 :(得分:3)
嗯不知道为什么,但我不能添加评论,所以我写这个作为答案。 Blauesocke答案的问题是AccessoryType不会设置为UITableViewCellAccessoryCheckmark,因此您无法检查单元格AccessoryType。有没有办法做到这一点,所以单元格AccessoryType将是corect类型只是另一个图像。
我正在使用这样的方法:
- (void)setAccessoryType:(UITableViewCellAccessoryType)newAccessoryType
{
[super setAccessoryType:newAccessoryType];
// Check for the checkmark
switch(newAccessoryType)
{
case UITableViewCellAccessoryCheckmark:
self.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yorCheckmark.png"]];
break;
case UITableViewCellAccessoryNone:
self.accessoryView = nil;
break;
default:
break;
}
}