Как отобразить пользовательский UITableViewCellAccessoryCheckmark

У меня есть табличное представление, которое нуждается в пользовательском 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 ответа

Решение

Гораздо чище и круче было бы переписать 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,

Хм, не знаю почему, но я не могу добавлять комментарии, поэтому я пишу это как ответ. Проблема с ответом Thomas Kekeisen состоит в том, что 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;
    }

}
Другие вопросы по тегам