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

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

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

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

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

Любые предложения?

Ответ 1

Любая случайность, которую вы случайно набрали, сделала De selectRowAtIndexPath?

Ответ 2

Также проверьте свойство выбора вида таблицы в файле xib. Используйте "Single Selection" или "Multiple Selection" по мере необходимости.

Ответ 3

У меня возникла следующая проблема:

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

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

enter image description here

Надеюсь, что кто-то поможет

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Я позвонил

[tableView deselectRowAtIndexPath:indexPath animated:NO];

первая вещь в

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

что не то же самое, но достаточно хорошо. заставляет меня задаться вопросом, что приводит к разрушению стола ios10.

Ответ 7

SWIFT 2

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

self.tableView.allowsSelection = true

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

Ответ 8

SWIFT 3

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

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

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

Ответ 9

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

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

Ответ 10

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

Ответ 11

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

Ответ 12

SWIFT 3

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

tableView.delaysContentTouches = false

Ответ 13

В моем случае у меня был заголовок раздела UITableView с распознавателем жестов. Когда заголовок коснулся, он должен вставить несколько строк в этот раздел и анимировать вставку (например, раздел развернуть/свернуть). При первом раскрытии и нажатии метод делегата didSelectRow не был запущен. Для дальнейших нажатий и действий по расширению/сворачиванию все работало как положено.

В ответе @Ayoub Nouri я установил false для CancelsTouchesInView, и это решило проблему. tapGestureRecognizer?.cancelsTouchesInView = false

Ответ 14

Swift 4.2

Отключение "Задержки касания" в инспекторе атрибутов решило проблему.
После этого щелчки сглаживаются и didSelectRowAt срабатывает немедленно.

XCode attributes inspector

Ответ 15

Что мне помогло, так это начать набирать "didSelect...", а затем дать автозамене заполнить все остальное. Видимо, некоторые детали моего синтаксиса были вялыми. Как уже говорили другие, используйте IDE !!