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


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

В MainViewController.h

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

// other stuff here...

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

В MainViewController.м

@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. Это перекрыло вызов выбора. Надо отдать должное тому, кто это предположил. Ваш ответ был удален, прежде чем я смог отметить его правильно.

Edit 2: Один многие люди комментировали это, поэтому я подумал, что поделюсь этим. Если вы испытываете эту проблему, просто установите myGestureRecognizer.cancelsTouchInView до false и все должно работать нормально.

13 57

13 ответов:

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

установить cancelsTouchesInView свойство NO на распознавателе жестов, чтобы табличное представление могло перехватить событие.

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

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

должно быть

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

обновлено для 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)
    }
}

как называется:- In ViewDidLoad ()

self.hideKeyboardWhenTappedAround()

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

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

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

или

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

мое решение :

  1. set cancelsTouchesInView до No из любого tapGesture

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

отменить другие виды касаний, кроме необходимого.

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

извините, не хватает очков, чтобы добавить комментарии - ответ Гаррета велик, но я бы добавил:

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

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

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

tableView.editing = YES;

но

tableView.allowsSelectionDuringEditing = NO;

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

- tableView:didSelectRowAtIndexPath:

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

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

выше проблема происходит в iPhone 4s, iOS 9.3. Но в iPhone 5s, iOS 10.3, нет никаких проблем, эти клетки работает нормально. Кажется, что iOS 9 ошибки UITableView.

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

tableView.estimatedSectionHeaderHeight = 60.0

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

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

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

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

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

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

похоже, что перезагрузка блоков просмотра нажимает.

это работа для меня, можете попробовать!

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) tap.cancelsTouchesInView = false view.addGestureRecognizer(tap)