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

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

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

Ответы [ 56 ]

0 голосов
/ 16 марта 2019

Я прочитал все ответы и полностью с ними согласен. Но в моем случае это совсем другое. У меня был новый segue для моего detailViewController, связанный напрямую с моим tableCell в StoryBoard, который вызвал это. Поэтому мне пришлось удалить этот переход из моей камеры и связать его с самим UITableViewController. Теперь, написав следующий код, он работает,

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        // Do any operation
        performSegue(withIdentifier: "DetailSegue", sender: self)
    }

Надеюсь, что это решение кому-то поможет!

0 голосов
/ 03 января 2018

Убедитесь, что вы звоните reloadData в главном потоке. Если вы вызываете этот метод из какого-то асинхронного метода (например, из-за какого-то сетевого запроса), табличное представление может или не может правильно реагировать (в некоторых случаях приложение может даже аварийно завершить работу).

Используйте блок кода основного потока для выполнения вызова reloadData, если вызов выполняется в каком-либо другом блоке метода (в котором вы не уверены):

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [tableView reloadData];
}];
0 голосов
/ 08 ноября 2017

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

Начиная с Xcode 9 / Swift 4 все методы Objective-C должны быть отмечены @objc. Компилятор делает разумную работу по распознаванию того, где он должен применяться, однако он не определяет наследование. Например:

class Delegate: NSObject, UITableViewDelegate {
}

class SuperDelegate: Delegate {
    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { return indexPath }
}

Это не вызовет никаких предупреждений, сбоев или сборок. Однако ваша линия не будет вызываться, пока вы не добавите @objc:

@objc class SuperDelegate: Delegate {
    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { return indexPath }
}
0 голосов
/ 15 ноября 2016
  1. Добавить @interface ExampleViewController () <UITableViewDelegate, UITableViewDataSource>

  2. Создайте делегирование в раскадровке

enter image description here

  1. Добавить код

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
       NSString *cellText = cell.textLabel.text;
    }
    
0 голосов
/ 16 марта 2019

вы должны проверить это выбор должен быть единичным, а редактирование не должно быть выбрано и вы меняете настройки в свойствах uttableviewcell также Вы редактируете в ячейке табличного представления стиль должен быть пользовательским, а идентификатор должен быть Rid и раздел отсутствует

0 голосов
/ 26 августа 2014

Не могу комментировать, пишите сюда. В моем случае didSelectRow работал, но не didDeselectRow. Я установил delegate и dataSource для tableView, и это решило мой случай.

...