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:
Кажется, что перезагрузка блоков блоков просмотра.