自定义UITableViewCellAccessoryCheck

自定义UITableViewCellAccessoryCheck

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

最佳答案

一种更干净更酷的方法是像这样覆盖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,因为您的 class 将自动用图像替换它。

您只应在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重新加载更改其样式(例如,选中标记)的两个单元格。

关于iphone - 如何显示自定义UITableViewCellAccessoryCheckmark,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14382322/

10-08 20:58