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


352

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

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

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

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

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


2
Можете ли вы опубликовать свой код для tableView:didSelectRowAtIndexPath:?
gerry3

У меня была такая же проблема, проверьте мой ответ: stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
Отправка в главной очереди решила мою проблему stackoverflow.com/questions/20149167/…
durgeshtrivedi

Ответы:


1356

Есть ли шанс, что вы случайно набрали De selectRowAtIndexPath?


17
@Dschee не вызывается при первом нажатии, потому что вы ничего не отменяете. После того, как вы выбрали одну строку, при попытке выбрать вторую, первая будет отменена.
Чувак

19
Вот почему я так люблю.
elbuild

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

8
О, МОЙ БОГ!! Это может быть худшая ошибка, которую я представил в своем коде.
Шантану Пол

4
УХ ТЫ. Сэкономил мне так много времени.
MortalMan

24

Также проверьте свойство selection вашего табличного представления в xib-файле. При необходимости используйте «Отдельный выбор» или «Многократный выбор».


2
Ба ха ха ха! Ничего себе я потратил 4 часа, пытаясь понять это. @includeMe на помощь (салют)! Спасибо!

17

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

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

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

введите описание изображения здесь

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


Ты мой герой! Есть идеи, почему это по умолчанию? Я не могу думать о каком-либо приложении с таким поведением, и я думаю, что это очень странное значение по умолчанию.
Кристоф Фондачи

12

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


У меня есть оба; Распознаватель жестов и didSelectRowAtIndexPath? Однако всегда распознаватель жестов имеет преимущество. Невозможно добраться до второго. Есть ли способ справиться с обоими или мне нужно избавиться от распознавателя жестов? Спасибо!
Рон

это должно быть на вершине :) это стоило мне 1 час после 7 лет в разработке iOS.
клоун

6

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

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


Вы нашли причину, почему это происходит? У меня точно такая же проблема. Когда я отключаю подпрыгивание таблицы, то первая / последняя строка таблицы не реагирует на первое нажатие. Я думал, что это ошибка, но прошло больше года, и это все еще происходит.
filip.karas

Нет, я просто включил отскок стола и оставил его на этом.
Чейз Робертс

У меня есть эта проблема только на iPhone 5 (iOS 10.3) - исправлена ​​ошибка включения отказов на моем столе. Очень странно!
Ли Проберт

4

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

Я закончил звонить

[tableView deselectRowAtIndexPath:indexPath animated:NO];

первым делом в

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

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


Это сработало для меня, но мне нужен обходной путь, чтобы скрыть выбор, не делая его стиль None. Я сделал переопределение, setSelectedно пока пользователь удерживает ячейку, появляется выбор, который не приемлем
MMujtabaRoohani

1

SWIFT 2

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

self.tableView.allowsSelection = true

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


1

SWIFT 3

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

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

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


1

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

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


1

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


0

SWIFT 3

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

tableView.delaysContentTouches = false


0

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


0

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

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


0

Swift 4.2

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

Инспектор атрибутов XCode


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.