DidSelectRowAtIndexPath: не называется

У меня есть UITableView как subview моего UIScrollVIew, который является основным видом, управляемым моим MainViewController.

В MainViewController.h

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>

// other stuff here...

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

В MainViewController.m

@synthesize myTableView;

// other stuff here...

- (void)viewDidLoad {
    myTableView.delegate = self;
    myTableView.datasource = self;
}

// other stuff here...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}

Я знаю, что didSelectRowAtIndexPath не вызывается, потому что я установил точки останова как для самого метода, так и для строки кода внутри него, и никто не вызывается. Я также знаю, что источник данных работает правильно, потому что у меня есть другие функции, которые изменяют ячейки во время выполнения, и они работают отлично. Я использую последний Xcode с iOS 5.0, установленным как цель разработки. Я искал и искал ответ. У кого-нибудь есть идеи?

Edit: Я нашел ответ. У меня был набор UITapGestureRecognizer для myTableView superView. Это перекрыло вызов выбора. Благодарите любого, кто предположил, что это возможно. Ваш ответ был удален, прежде чем я смог отметить его правильно.

Изменить 2: Многие люди комментируют это, поэтому, хотя я бы поделился им. Если вы столкнулись с этой проблемой, просто установите myGestureRecognizer.cancelsTouchInView на false, и все должно работать нормально.

Ответ 1

Я нашел ответ. У меня был набор UITapGestureRecognizer для супервизора myTableView. Это перекрыло вызов выбора. Благодарите любого, кто предположил, что это возможно. Ваш ответ был удален, прежде чем я смог отметить его правильно.

Установите для свойства cancelsTouchesInView значение NO в распознавателе жестов, чтобы разрешить перехват события в виде таблицы.

Ответ 2

Ваша проблема - чувствительность к регистру. Ваш код:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {

должен быть

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {

Ответ 3

Возможно, это опечатка. Убедитесь, что вместо функции выберите didDeselectRowAtIndexPath: (de).

Ответ 4

Обновлен для Swift 3:

, если вы используете UITapGestureRecognizer в своем коде: - # Swift 3 используйте ниже строки кода:

extension YourViewController{
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
        tap.cancelsTouchesInView = false
    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}

Как вызвать: - В ViewDidLoad()

self.hideKeyboardWhenTappedAround()

Ответ 5

Вы указали переменную экземпляра для tableview с тем же именем. Если нет, возможно, это может быть проблема-

_myTableView.delegate = self;
_myTableView.datasource = self;

Or-

self.myTableView.delegate = self;
self.myTableView.datasource = self;

Ответ 6

Мое решение:

  • установите cancelsTouchesInView В No любого tapGesture

  • Я нашел в своей настраиваемой ячейке, userInteractionEnable установлен в   No, просто удалите userInteractionEnable = No и решите проблему.

Ответ 7

Отмените другие образы, за исключением требуемого.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
    if (touch.view == your view) {
        return YES;
    }
    return NO;
}

Ответ 8

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

У вас все еще может быть ваш распознаватель жестов, но вам нужно будет установить "Отменить касания в поле зрения" до "НЕТ" - тогда жесты будут переданы в представление, и ваш UITableView будет работать нормально.

Попробовав много, много подходов, это, по-видимому, правильный способ делать вещи: распознаватель жестов при нажатии "отменить касания в представлении" похож на наличие невидимого слоя поверх всего, что захватывает все события и направляет их на контроллер представления (прокси). Контроллер вида затем смотрит на жест, чтобы увидеть, имеет ли он привязку действий (кнопки и т.д.), И направит их, а остальные останутся только для обработчика жестов. При использовании UITableView он ожидает получения крана, но контроллер вида отображает его, когда у вас есть "Отменяет касание в поле зрения".

Ответ 9

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

tableView.editing = YES;

но

tableView.allowsSelectionDuringEditing = NO;

Согласно документации для

- tableView:didSelectRowAtIndexPath:

Этот метод не вызывается, если для свойства редактирования таблицы установлено значение YES (то есть, представление таблицы находится в режиме редактирования). См. "Управление выборами" в Руководстве по программированию таблиц для iOS для получения дополнительной информации (и примеров кода), относящейся к этому методу.

Ответ 10

Ячейку можно выбрать пользователем (нажав на строку), вызывая "tableView.selectRowAtIndexPath(..)" или "cell.setSelected(true,...).

  • Если ячейка выбрана вызовом "cell.setSelected(true)", пользователь не может отменить выбор ячейки больше.

  • Если ячейка выбрана вызовом "tableView.selectRowAtIndexPath()", пользователь может отменить выбор ячейки как ожидается.

Ответ 11

Мое дело странно. Мой tableView имеет 2 раздела. Ячейки первого раздела работают нормально tableView:didSelectRowAt:, но ячейки второго раздела не запускают didSelectRowAt:.

Вышеупомянутая проблема возникает при iPhone 4s, iOS 9.3. Но в iPhone 5s, iOS 10.3 проблем нет, эти ячейки прекрасно работают. Похоже, iOS 9 ошибки UITableView.

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

tableView.estimatedSectionHeaderHeight = 60.0

Потому что 2-й раздел не имеет заголовка. Я удаляю эту строку, и все работает нормально.

Ответ 12

У меня был прерывистый сбой didSelectRowAtIndexPath: вызывается в моем пользовательском прессе ячейки.

Я обнаружил, что если я очень часто перестал называть [tableView reloadData] (10 Гц) и менял его на обновление каждые 2 секунды, почти каждое нажатие успешно вызывало didSelectRowAtIndexPath:

Кажется, что перезагрузка блоков блоков просмотра.