UITableView didSelectRowAtIndexPath: не вызывается при первом нажатии

у меня проблема с UITableView's didSelectRowAtIndexPath.

моя таблица настроена так, что при выборе строки она инициализирует новый контроллер представления и нажимает его.

при первом нажатии любой строки в таблице Метод не вызывается. Как только я выбираю другую строку, она начинает работать как обычно.

Я проверил это, установив точку останова на didSelectRowAtIndexPath. При добавлении NSLog к методу я вижу, что когда я выбираю вторую строку, которая, наконец, толкает новый view controller, я вижу, что в консоли одновременно появляются две инструкции журнала.

какие предложения?

12 ответов


любой шанс, что вы случайно набрали did DeselectRowAtIndexPath?


также проверьте свойство selection вашего табличного представления в xib-файле. Один выбор " или "множественный выбор', как требуется.


Я испытал следующую проблему:

  • первый кран в строке - > нет эффекта, нет выбора,никогда
  • второе нажатие и следующее - > правильное поведение выбора,всегда

в моем случае моей ошибкой была проверка Show Selection on Touch в интерфейсе строителя. Вы можете снять флажок в IB здесь:

enter image description here

надеюсь, что это поможет кому-то


Проверьте, установили ли вы распознаватели жестов в своем классе. Удаление жестов сработало для меня.


Я обсуждал даже публикацию этого ответа, потому что я думаю, что звезды выровнены, чтобы это проявилось.

У меня есть вариант этой проблемы и я проверил другие решения. В моем представлении таблицы он не обрабатывает самую последнюю строку моей таблицы при первом нажатии. Это подчеркивает его, но didSelectRowAtIndexPath не называют. Все остальные строки работают нормально. Но если я включу TableView bounce, то это, похоже, решит проблему (но тогда вам придется иметь дело с tableview bounce).


UITableViewCellSelectionStyleNone был установлен для ячейки, отображающей эту проблему (iOS 9 охота).

Я закончил тем, что позвонил

[tableView deselectRowAtIndexPath:indexPath animated:NO];

первым делом

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

это не то же самое, но достаточно хороший. заставляет меня задаться вопросом, какой вид обрыва таблицы iOS10 приносит.


SWIFT 2

убедитесь, что у вас установлено значение true:

self.tableView.allowsSelection = true

положите это над вашим правом после вашего viewDidLoad() и до super.viewDidLoad()


SWIFT 3

Если вы работаете с Swift 3 в классе, который не является UITableViewController и вы используете UITableViewDelegate, тогда вам может потребоваться использовать название метода:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Это сработало для меня, хотя я только что перенес свой проект на Swift 3. Это довольно новое, так что это может быть исправлено позже.


функция didSelectRowAt не вызывалась в моем приложении в первом или втором касании... Я пытался решить проблему не мог найти любое решение. Но вдруг я стал узнавать, я использовал вид.изменение цвета анимации... Метод делегата не вызывался при сохранении анимации


SWIFT 3

ни один из других ответов не работал в моем случае, что исправило его для меня:

tableView.delaysContentTouches = false


Если вы установили UITapGestureRecognizer в своем классе, вы можете добавить эту строку в свой didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

это сработало для меня.


эта проблема возникает также при работе с распознавателем жестов в tableView в этом случае вам не нужно их удалять, вам нужно только убедиться, что ваше свойство жеста cancelsTouchesInView = false Это логическое значение, влияющее на то, доставляются ли касания в представление при распознавании жеста.