UITableViewCell setSelected: анимированный: не работает

Это сводит меня с ума. Я смотрел здесь на SO, потому что я думал, что это простой ответ, но не смог найти его.

В моем UITableViewCell:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{   
    // Configure the view for the selected state
    if (selected) {        
        [self.languageLevelNameLabel setTextColor:[UIColor blackColor]];        
    }
    else {        
        [self.languageLevelNameLabel setTextColor:[UIColor colorMessageCountZero]];
    }

    [self setNeedsDisplay];
}

В tableView:cellForRowAtIndexPath: контроллера:

 if ([level integerValue] == indexPath.row) {

        [cell setSelected:YES];
    }

Я вставил точки selected == YES и selected == YES получает переданный для правильной ячейки, и оператор if выполняется, когда это должно быть, но текст никогда не будет установлен в blackColor.

Ответ 1

Если вы хотите установить свою ячейку как выбранную, используйте метод selectRowAtIndexPath:animated:scrollPosition: как это в вашем методе cellForRowAtIndexPath вашего представления таблицы

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

Ответ 2

Чтобы ячейка была выбрана, вы должны вызвать -setSelected:animated: из -tableView:willDisplayCell:forRowAtIndexPath: вот так:

Цель C:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (/* should be selected */) {
        [cell setSelected:YES animated:NO];
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];  // required, as noted below
    }
}

Swift 3:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if (/* should be selected */) {
        cell.setSelected(true, animated: false)
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)  // required, as noted below
    }
}

Вызов -setSelected из другого места не влияет.

Зачем? После инициализации или ячеек освобождения пакета из очереди, но перед отображением, табличные вызывает собственный метод -_configureCellForDisplay:forIndexPath: который, помимо всего прочего, устанавливает ячейки selected свойство в NO. Делегат willDisplayCell:forRowAtIndexPath: после этого, позволяя вам устанавливать все необходимое для отображения.

Ответ 3

Пытаться

NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:number_row  inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

Ответ 4

Нет необходимости вызывать метод set cellSelected. Надеемся, что мы установим статус выбранного ячейки с помощью двух функций, один из которых - didSelectRowAtIndexPath, другой - didDeselectRowAtIndexPath, они всегда встречаются парами. Чтобы решить эту проблему, мы просто вызываем две функции:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

[self tableView:self.leftTableView didSelectRowAtIndexPath:indexPath];
[self.leftTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];