-didSelectRowAtIndexPath: не вызывается - PullRequest
283 голосов
/ 01 ноября 2008

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

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

Ответы [ 56 ]

533 голосов
/ 25 сентября 2012

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

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

479 голосов
/ 12 октября 2012

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

UITableView selection kind

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

284 голосов
/ 02 ноября 2012

Другая возможность состоит в том, что UITapGestureRecognizer может есть события, как здесь: https://stackoverflow.com/a/9248827/214070

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

149 голосов
/ 06 мая 2012

Все хорошие ответы, но есть еще один, который нужно посмотреть ...

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

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

93 голосов
/ 01 ноября 2008

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

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

83 голосов
/ 30 января 2015

Если проблема возникает с 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
63 голосов
/ 02 ноября 2008

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

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

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

44 голосов
/ 26 октября 2010

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

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

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

37 голосов
/ 24 февраля 2016

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

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}
28 голосов
/ 23 июля 2013

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

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

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

...