#ИМЯ?

Я пишу приложение iOS с табличным представлением в виде табуляции. В моем UITableViewController я реализовал -tableView:didSelectRowAtIndexPath:, но когда я выбираю строку во время выполнения, метод не вызывается. Однако представление таблицы заполняется, поэтому я знаю, что вызываются другие методы tableView в моем контроллере.

Есть ли у кого-нибудь идеи, что я, возможно, придумал, чтобы это произошло?

Ответ 1

Похоже, что класс не является UITableViewDelegate для этого представления таблицы, хотя UITableViewController должен устанавливать это автоматически.

Если у вас есть reset делегат какого-либо другого класса?

Ответ 2

На всякий случай кто-то совершил ту же самую глупую ошибку, что и я:

Проверьте, может ли каким-либо образом получить имя метода того, что вы ожидаете от didSelect, случайно получить didDeselect. Мне потребовалось около двух часов, чтобы узнать...

Ответ 3

Еще одна вещь, которая может привести к проблеме, это не выбранный вид выбора:

UITableView selection kind

Должно быть Single Selection для нормального выбора, не должно быть No Selection.

Чтобы сделать это программно, выполните:

tableView.allowsSelection = YES

Ответ 4

Другая возможность заключается в том, что UITapGestureRecognizer может есть события, как это было здесь: fooobar.com/questions/19333/...

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

Ответ 5

Все хорошие ответы, но есть еще один, чтобы посмотреть...

(особенно при создании программного обеспечения UITableView)

Убедитесь, что tableView может ответить на выбор, установив [tableView setAllowsSelection:YES]; или удалив любую строку, которая устанавливает ее на NO.

Ответ 6

Если проблема возникает с UITapGestureRecognizer, вы можете это исправить:

  • в раскадровке:

enter image description here

в коде с Objective-C:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

в коде с Swift:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

Ответ 7

В этой ситуации я столкнулся с двумя вещами.

  • Возможно, вы забыли реализовать протокол UITableViewDelegate, или нет лимита делегирования между вашим классом и табличным представлением.

  • У вас может быть UIView внутри вашей строки, которая является первым ответчиком и отнимает ваши клики. Скажите UIButton или что-то подобное.

Ответ 8

У меня была та же проблема. И это было трудно найти. Но где-то в моем коде было следующее:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Он должен быть return indexPath, иначе -tableView:didSelectRowAtIndexPath: не вызывается.

Ответ 9

Если вы добавили gestRecognizer поверх UITableView, didSelectRowAtIndexPath не будет вызван.

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

Ответ 10

У меня возникла проблема, когда после нескольких месяцев отсутствия моего кода я забыл, что я реализовал следующий метод из-за некоторых требований, которые не были необходимы

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Он должен возвращать YES для строки, чтобы сделать ее выбранной.

Ответ 11

ВЫ ДОЛЖНЫ выбрать эти параметры

enter image description here

но если вы хотите, чтобы UITableView не выделялся при нажатии, вам следует внести изменения в свойства UITableViewCell.

Выберите "Нет" для выбора, как показано ниже

enter image description here

Ответ 12

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

Ответ 14

У меня была та же проблема,

Причина заключалась в использовании UITapGestureRecognizer. Я хотел, чтобы клавиатура уволилась, когда я нажал где-нибудь еще. Я понял, что это отменяет все действия нажатия, поэтому функция didSelectRowAtIndexPath не вызывалась.

Когда я комментирую строки, связанные с UITapGestureRecognizer, он работает. Кроме того, вы можете проверить функцию UITapGestureRecognizer selector, если нажато UITableViewCell или нет.

Ответ 15

В моем случае не вызывал didSelctRowAtIndexPath из-за того, что я выбрал none в свойстве Selection tableView, установив одиночный выбор, решил мою проблему

enter image description here

Ответ 16

Для Xcode 6.4, Swift 1.2. Выбор "тега" был изменен в IB. Я не знаю, как и почему. Установив его в "Single Selection", я снова выбрал ячейки таблицы. введите описание изображения здесь

Ответ 17

Несмотря на то, что был принят другой ответ, я добавлю еще одну возможную проблему и решение для людей, которые соблюдают эту проблему:

Если у вас включен автоматический подсчет ссылок (ARC), вы можете обнаружить, что даже после назначения вашего контроллера в качестве делегата представления сообщения представления диспетчеру не принимаются, поскольку ARC удаляет контроллер. По-видимому, указатель делегата UITableView не считается ссылкой для ARC, поэтому, если это единственная ссылка на него, контроллер будет dealloc'd. Вы можете проверить, происходит ли это, реализуя метод dealloc на контроллере и устанавливая там точку останова или вызов NSLog.

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

Ответ 18

Не забудьте установить источник данных и делегат в методе viewDidLoad следующим образом:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Ответ 19

Моя проблема не была из вышеперечисленного. И так хромой. Но я думал, что перечислил его здесь, если это поможет кому-то.

У меня есть tableViewController, который является моим "базовым" контроллером, а затем создаю подклассы этого контроллера. Я писал весь свой код в подпрограмме tableView:didSelectRowAtIndexPath в классе "base". Полностью забыв, что по умолчанию эта подпрограмма также была создана (хотя и без кода, который сделал что-либо) во всех моих подклассах. Поэтому, когда я запускал свое приложение, он запускал подклассовую версию кода, ничего не делал, и мне стало грустно. Поэтому, конечно, как только я удалил подпрограмму из подклассов, она использовала обычную процедуру класса "базовый", и я занимаюсь бизнесом.

Я знаю. Не смейтесь. Но, возможно, это спасет кого-то в тот час, когда я потерял...

Ответ 20

Предоставляя свои 2 цента на этом.

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

Либо удалите кнопку, либо в моем случае, я установил для параметра User Interation Enable значение false на кнопке, таким образом, ячейка была выбрана.

Ответ 21

Если вы прочтете это, все равно не решите проблему.

У меня есть пользовательская ячейка, где флажок " Взаимодействие с пользователем" отключено. Итак, я просто включил его. Удачи.

Ответ 22

У меня только что было это, и, как случилось со мной, в прошлом это не сработало, потому что я не обратил внимания на автозаполнение при попытке добавить метод, и на самом деле я в конечном итоге реализую tableView:didDeselectRowAtIndexPath: вместо tableView:didSelectRowAtIndexPath:.

Ответ 23

Я знаю, что старый, и проблема была решена, но у меня была аналогичная проблема, я думал, что проблема связана с моим пользовательским UITableViewCell, но решение было совершенно другим - я перезапускаю XCode:), а затем работает нормально! почти как Windows:)

Ответ 24

Убедитесь, что вы реализовали tableView:didSelectRowAtIndexPath, а не tableView:didDeSelectRowAtIndexPath

Это было получено мной не раз!

Ответ 25

Если ваш вид таблицы находится в режиме редактирования (например, [tableView setEditing:YES animated:NO];), вам нужно установить tableView.allowsSelectionDuringEditing = YES;

Ответ 26

Еще одна ошибка, которую вы могли бы сделать (как и я): если вы установили segue в ячейке, didSelectRowAtIndexPath не вызывается. Вместо этого вы должны установить свои segues на контроллере вида.

Ответ 27

Ни один из этих ответов не работал у меня. Примерно через час я понял что-то очень коварное:

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

Оказывается, что UITableViewCell уже имеет contentView и делает с ним странные вещи. Проблема разрешилась, когда я переименовал свойство в mainContentView и переподключил представление к этому переименованному свойству.

Ответ 28

В моем случае я динамически вычисляю высоту TableView SuperView во время загрузки. Из-за просчета, TableView располагался за пределами SuperView. TableView был нарисован отлично, однако все взаимодействия были отключены (и didSelectRowAtIndexPath никогда не вызывался). Очень трудно обнаружить, так как нет визуальной индикации, что TableView не "доступен".

Ответ 29

В моем случае решение заключалось в том, чтобы изменить NO на YES в следующей функции.

iOS 9 +

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Ответ 30

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

Я посмотрел в IB и увидел, что мой делегат WAS установлен, но он был установлен неправильно для VIEW, а не для File Owner (щелкните правой кнопкой мыши по представлению таблицы, чтобы увидеть, куда указывает делегат).

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