Подтвердить что ты не робот

Изменение галочки UITableViewCell при выборе

Правильно ли я полагаю, что для изменения галочки для "on" на "off", я должен изменить CellAccessoryType между none и checkmark на didSelectRowAtIndexPath?

Потому что я сделал это, но я заметил, что поведение не совсем идентично поведению с ячейками галочки в настройках автоматической блокировки на iphone.

Или есть ли какие-то другие флажки, предназначенные для обработки?

4b9b3361

Ответ 1

  • Сохраните свойство в вашем контроллере вида с именем selectedRow, который представляет индекс строки, представляющей отмеченный элемент в разделе таблицы.

  • В вашем представлении метода делегата -tableView:cellForRowAtIndexPath: делегировать значение accessoryType от cell до UITableViewCellAccessoryCheckmark, если ячейка indexPath.row равна значению selectedRow. В противном случае установите его на UITableViewCellAccessoryNone.

  • В вашем режиме управления делегатом -tableView:didSelectRowAtIndexPath: установите значение selectedRow в indexPath.row, которое выбрано, например: self.selectedRow = indexPath.row

Ответ 2

Другое решение:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow];
    [self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    return indexPath;
}

И да: вам не нужно проверять, имеет ли oldIndex nil :)


Свифт 3 и позже:

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let oldIndex = tableView.indexPathForSelectedRow {
        tableView.cellForRow(at: oldIndex)?.accessoryType = .none
    }
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    return indexPath
}

Ответ 3

Zyphrax предложила отличное решение, которое отлично поработало для меня! И если вам нужно очистить предыдущую выбранную строку, просто используйте:

[self.tableView reloadData]; 

в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Ответ 4

Это должно быть

didHighlightRowAtIndexPath

вместо

Tableview: didSelectRowAtIndexPath

Ответ 5

Ответ Alex работал у меня только после добавления таблицы перезагрузки, в .h

{
  int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;

в .m * cellForRowAtIndexPath *

if(indexPath.row == selectedCell)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.selected = YES;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selected = NO;
    }

и в любом месте didHighlightRowAtIndexPath или didSelectRowAtIndexPath

 self.selectedCell = indexPath.row;
    [self.tableView reloadData]; 

Ответ 6

скор:

var selectedCell:UITableViewCell?{
    willSet{
        selectedCell?.accessoryType = .None
        newValue?.accessoryType = .Checkmark
    }
}

то

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
    self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}

Ответ 7

Если вы хотите использовать свой собственный образ в качестве аксессуара, используйте ниже код

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]];
    [imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)];
    imgCheckMark.tag = 1000+indexPath.row;

    NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow];
    [self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone;
    [self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark;
    return indexPath;
}

Ответ 8

Для быстрой

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
  }

  func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
  }