如何显示自定义UITableViewCellAccessoryCheckmark

时间:2013-01-17 15:21:24

标签: iphone ios objective-c uitableview

我有一个需要自定义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;
}

2 个答案:

答案 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;
    }

}