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];