2012-01-21 6 views
51

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

В 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, установленным как цель разработки. Я искал и искал ответ. У кого-нибудь есть идеи?

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

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

+0

Вы реализовали 'tableView: willSelectRowAtIndexPath:'? Возможно, он возвращает nil, тем самым предотвращая вызов 'didSelectRowAtIndexPath:' от вызова? –

+0

да Я тоже попробовал – Garrett

+0

Спасибо, что вернулись с вашим решением. Я думаю, что лучше было бы отредактировать это как ответ. –

ответ

263

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

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

+13

Это была проблема для меня, мой коллега добавил UITapGestureRecognizer к представлению, близкому к корню, которое ест события крана. Однако вводить в заблуждение было то, что ячейки таблицы все еще будут выделяться, когда они будут прослушиваться, поэтому я не подозревал, что что-то перехватывает эти события. – bugloaf

+14

Это проблема для меня. Обязательно проверьте свойство cancelsTouchesInView распознавателя жестов.Если это ДА, то он ест событие. –

+0

Огромное спасибо, действительно спасли мой день. Не понял, что UITapGestureRecognizer, добавленный из раскадровки, помешает вызывать функцию! Любопытно, что UITableViewCells все еще выделяет Taps. – David

5

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

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

Or-

self.myTableView.delegate = self; 
self.myTableView.datasource = self; 
+0

Я попробовал self.myTableView.delegate без успеха – Garrett

+1

Awesome! Ищите долго и широко для этой проблемы, и проблема в том, что я не задал: self.tableView.delegate = self; – hbruce

10

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

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

должен быть

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

Это был хороший улов, но ошибка была просто опечаткой при копировании моего кода в вопрос, это правильно в моем приложении – Garrett

+0

Какая разница между двумя строками кода? –

+1

«i» в первом «tableView» заглавная буквами в первой (ошибочной) версии. –

7

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

+0

Я прочитал свой код 20 двадцать раз, сравнивая его с текстом книги и до сих пор не заметил, что у меня «De'select! –

+0

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

1

К сожалению, нет достаточно очков, чтобы добавить комментарий - ответ Гаррет является большим, но я хотел бы добавить:

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

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

0

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

tableView.editing = YES; 

но

tableView.allowsSelectionDuringEditing = NO; 

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

- tableView:didSelectRowAtIndexPath: 

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

5

Мое решение:

  1. набор cancelsTouchesInView Для No любого tapGesture

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

0

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

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

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

3

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

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

Обновление для 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() 
1

Мой случай странно. Мой 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-й раздел не имеет заголовка. Я удаляю эту строку, и все работает нормально.

0

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

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

Похоже перезарядке видовые блоки прессы.

Смежные вопросы