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

Також перевірте властивість вибору подання таблиці у файлі xib. Використовуйте "Одиночний вибір" або "Множинні виділення" за потребою.


2
Ба-ха-ха-ха! Нічого, я витратив 4 години, намагаючись зрозуміти це. @includeMe на допомогу (салют)! Дякую!

17

У мене виникло таке питання:

  • спочатку торкніться рядка -> без ефекту, без вибору, ніколи
  • друге натискання та наступне -> правильна поведінка вибору завжди

У моєму випадку моя помилка була перевірка Show Selection on Touchв Interface Builder. Зніміть його в IB можна тут:

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

Сподіваюся, що хтось допомагає


Ти мій герой! Будь-яка ідея, чому це за замовчуванням? Я не можу придумати жоден додаток, що має таку поведінку, і я думаю, що це дуже дивний дефолт.
Крістоф Фондчі

12

Перевірте, чи встановили ви розпізнавачі жестів у своєму класі. Видалення жесту працювало для мене.


У мене обоє; Розпізнавальник жестів і didSelectRowAtIndexPath? Однак завжди розпізнавальник жестів віддає перевагу. Неможливо дістатися до другого. Чи є спосіб впоратися з обома або мені потрібно позбутися розпізнавача жестів? Дякую!
Рон

це повинно бути на вершині :) це коштувало мені 1 годину після 7 років розвитку iOS.
Клоун

6

Я навіть обговорював цю відповідь, бо вважаю, що зірки вирівнюються для того, щоб це проявилося.

У мене є проблема цієї проблеми і я перевірив інші рішення. На моєму перегляді таблиці він не обробляє останній рядок моєї таблиці під час першого дотику. Це підкреслює це, але didSelectRowAtIndexPathне називається. Всі інші ряди працюють добре. Але якщо я вмикаю відмов tableview, тоді це, здається, вирішить проблему (але тоді вам доведеться мати справу з відскоком tableview).


Ви знайшли причину, чому це відбувається? У мене точно таке саме питання. Коли я вимикаю підстрибуючи стіл, то перший / останній рядок таблиці не реагує на перший дотик. Я думав, що це помилка, але це більше року, і це все ще відбувається.
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 я встановив параметр cancellsTouchesInView неправдивим, і це вирішило проблему. tapGestureRecognizer? .cancelsTouchesInView = false


0

Швидкий 4.2

Вимкнення "Затримки торкання вниз" в атрибутах інспектор вирішив проблему.
Після цього кліки плавні і didSelectRowAt негайно спрацьовує.

XCode приписує інспектор


0

Що для мене працювало - почати вводити "didSelect ...", а потім дозволити автокорекції заповнити решту. Мабуть, якась деталь мого синтаксису була химерною. Як говорили інші, використовуйте ІДЕ !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.