2

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

2 回答 2

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

于 2013-01-17T15:36:09.480 回答
3

嗯不知道为什么,但我不能添加评论,所以我写这个作为答案。Blauesocke答案的问题是 AccessoryType 不会设置为 UITableViewCellAccessoryCheckmark,因此您无法检查单元格 AccessoryType。有什么方法可以做到这一点,所以单元格 AccessoryType 将是正确的类型,只是另一个图像。

我正在使用这样的方法:

- (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;
    }

}
于 2013-01-18T13:23:04.173 回答