-didSelectRowAtIndexPath: не вызывается


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

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

30 266

30 ответов:

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

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

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

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

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

UITableView selection kind

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

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

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

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

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

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

если проблема возникает с 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

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

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

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

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

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

должно быть return indexPath, else -tableView:didSelectRowAtIndexPath: не называют.

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

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

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

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

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

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

вы должны выбрать эти параметры

enter image description here

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

выберите ни один вариант для выбора так же, как ниже

enter image description here

в случае, если у вас такая же проблема как и у меня: По-видимому, этот метод не будет вызван, если ваш tableView находится в режиме редактирования. Вы должны установить allowsSelectionDuringEditing в true.

через это вопрос: при редактировании `UITableView ' не вызывает didSelectRowAtIndexPath ??

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

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

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

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

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

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

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

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

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

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

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

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

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

отдавая мои 2 цента на это.

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

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

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

У меня есть custom ячейки, где чекбокс "Взаимодействие С Пользователем Включено" был отключить. Так что я просто включаю его. Удача.

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

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

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

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

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

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

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

в моем случае решение состояло в том, чтобы изменить нет на Да в приведенной ниже функции.

iOS 9+

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

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

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

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

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

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

Это меня более чем несколько раз !!

позаботьтесь о UITableView свойства в раскадровке, что произошло в моем случае было то, что у меня был combox в раскадровке выбран как "Selection: Single Selection", что не позволяет метод didSelectRowAtIndexPath run.