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 ответов:
Я нашел ответ. У меня был 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;
мое решение :
set
cancelsTouchesInView
доNo
из любого tapGestureя нашел в своей пользовательской ячейке,
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:
похоже, что перезагрузка блоков просмотра нажимает.