Ответ 1
Похоже, что класс не является UITableViewDelegate
для этого представления таблицы, хотя UITableViewController
должен устанавливать это автоматически.
Если у вас есть reset делегат какого-либо другого класса?
Я пишу приложение iOS с табличным представлением в виде табуляции. В моем UITableViewController
я реализовал -tableView:didSelectRowAtIndexPath:
, но когда я выбираю строку во время выполнения, метод не вызывается. Однако представление таблицы заполняется, поэтому я знаю, что вызываются другие методы tableView в моем контроллере.
Есть ли у кого-нибудь идеи, что я, возможно, придумал, чтобы это произошло?
Похоже, что класс не является UITableViewDelegate
для этого представления таблицы, хотя UITableViewController
должен устанавливать это автоматически.
Если у вас есть reset делегат какого-либо другого класса?
На всякий случай кто-то совершил ту же самую глупую ошибку, что и я:
Проверьте, может ли каким-либо образом получить имя метода того, что вы ожидаете от didSelect
, случайно получить didDeselect
. Мне потребовалось около двух часов, чтобы узнать...
Еще одна вещь, которая может привести к проблеме, это не выбранный вид выбора:
Должно быть Single Selection
для нормального выбора, не должно быть No Selection
.
Чтобы сделать это программно, выполните:
tableView.allowsSelection = YES
Другая возможность заключается в том, что UITapGestureRecognizer может есть события, как это было здесь: fooobar.com/questions/19333/...
Я не подозревал об этой причине, потому что ячейки таблицы все еще выделяли синий цвет, как если бы краны проходили.
Все хорошие ответы, но есть еще один, чтобы посмотреть...
(особенно при создании программного обеспечения UITableView)
Убедитесь, что tableView может ответить на выбор, установив [tableView setAllowsSelection:YES];
или удалив любую строку, которая устанавливает ее на NO
.
Если проблема возникает с UITapGestureRecognizer
, вы можете это исправить:
в коде с Objective-C
:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
[tap setCancelsTouchesInView:NO];
в коде с Swift
:
let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)
tap.cancelsTouchesInView = false
В этой ситуации я столкнулся с двумя вещами.
Возможно, вы забыли реализовать протокол UITableViewDelegate, или нет лимита делегирования между вашим классом и табличным представлением.
У вас может быть UIView внутри вашей строки, которая является первым ответчиком и отнимает ваши клики. Скажите UIButton или что-то подобное.
У меня была та же проблема. И это было трудно найти. Но где-то в моем коде было следующее:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
Он должен быть return indexPath
, иначе -tableView:didSelectRowAtIndexPath:
не вызывается.
Если вы добавили gestRecognizer поверх UITableView, didSelectRowAtIndexPath
не будет вызван.
Поэтому вам нужно использовать метод делегата gestRecognizer, чтобы избежать касания в конкретном представлении.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isDescendantOfView:YourTable]) {
return NO;
}
return YES;
}
У меня возникла проблема, когда после нескольких месяцев отсутствия моего кода я забыл, что я реализовал следующий метод из-за некоторых требований, которые не были необходимы
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
Он должен возвращать YES для строки, чтобы сделать ее выбранной.
ВЫ ДОЛЖНЫ выбрать эти параметры
но если вы хотите, чтобы UITableView
не выделялся при нажатии, вам следует внести изменения в свойства UITableViewCell
.
Выберите "Нет" для выбора, как показано ниже
Я положил UITapGestureRecognizer
на мой вид таблицы, чтобы убрать клавиатуру, которая запретила вызов didSelectRowAtIndexPath:
. Надеюсь, это поможет кому-то.
Если у вас есть такая же проблема, как у меня: По-видимому, этот метод не будет вызываться, если ваш TableView находится в режиме редактирования. Вы должны установить allowSelectionDuringEditing в true.
Через этот вопрос: При редактировании` UITableView` не вызывает didSelectRowAtIndexPath??
У меня была та же проблема,
Причина заключалась в использовании UITapGestureRecognizer
. Я хотел, чтобы клавиатура уволилась, когда я нажал где-нибудь еще. Я понял, что это отменяет все действия нажатия, поэтому функция didSelectRowAtIndexPath
не вызывалась.
Когда я комментирую строки, связанные с UITapGestureRecognizer
, он работает. Кроме того, вы можете проверить функцию UITapGestureRecognizer selector
, если нажато UITableViewCell
или нет.
В моем случае не вызывал didSelctRowAtIndexPath из-за того, что я выбрал none в свойстве Selection tableView, установив одиночный выбор, решил мою проблему
Для Xcode 6.4, Swift 1.2. Выбор "тега" был изменен в IB. Я не знаю, как и почему. Установив его в "Single Selection", я снова выбрал ячейки таблицы.
Несмотря на то, что был принят другой ответ, я добавлю еще одну возможную проблему и решение для людей, которые соблюдают эту проблему:
Если у вас включен автоматический подсчет ссылок (ARC), вы можете обнаружить, что даже после назначения вашего контроллера в качестве делегата представления сообщения представления диспетчеру не принимаются, поскольку ARC удаляет контроллер. По-видимому, указатель делегата UITableView не считается ссылкой для ARC, поэтому, если это единственная ссылка на него, контроллер будет dealloc'd. Вы можете проверить, происходит ли это, реализуя метод dealloc на контроллере и устанавливая там точку останова или вызов NSLog.
Решение состоит в том, чтобы отслеживать контроллер с сильной ссылкой в другом месте, пока вы не уверены, что вам больше не понадобится.
Не забудьте установить источник данных и делегат в методе viewDidLoad следующим образом:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
Моя проблема не была из вышеперечисленного. И так хромой. Но я думал, что перечислил его здесь, если это поможет кому-то.
У меня есть tableViewController
, который является моим "базовым" контроллером, а затем создаю подклассы этого контроллера. Я писал весь свой код в подпрограмме tableView:didSelectRowAtIndexPath
в классе "base". Полностью забыв, что по умолчанию эта подпрограмма также была создана (хотя и без кода, который сделал что-либо) во всех моих подклассах. Поэтому, когда я запускал свое приложение, он запускал подклассовую версию кода, ничего не делал, и мне стало грустно. Поэтому, конечно, как только я удалил подпрограмму из подклассов, она использовала обычную процедуру класса "базовый", и я занимаюсь бизнесом.
Я знаю. Не смейтесь. Но, возможно, это спасет кого-то в тот час, когда я потерял...
Предоставляя свои 2 цента на этом.
У меня был пользовательский UITableViewCell, и была кнопка, охватывающая всю ячейку, поэтому, когда произошло прикосновение, кнопка была выбрана, а не ячейка.
Либо удалите кнопку, либо в моем случае, я установил для параметра User Interation Enable значение false на кнопке, таким образом, ячейка была выбрана.
Если вы прочтете это, все равно не решите проблему.
У меня есть пользовательская ячейка, где флажок " Взаимодействие с пользователем" отключено. Итак, я просто включил его. Удачи.
У меня только что было это, и, как случилось со мной, в прошлом это не сработало, потому что я не обратил внимания на автозаполнение при попытке добавить метод, и на самом деле я в конечном итоге реализую tableView:didDeselectRowAtIndexPath
: вместо tableView:didSelectRowAtIndexPath:
.
Я знаю, что старый, и проблема была решена, но у меня была аналогичная проблема, я думал, что проблема связана с моим пользовательским UITableViewCell, но решение было совершенно другим - я перезапускаю XCode:), а затем работает нормально! почти как Windows:)
Убедитесь, что вы реализовали tableView:didSelectRowAtIndexPath
, а не tableView:didDeSelectRowAtIndexPath
Это было получено мной не раз!
Если ваш вид таблицы находится в режиме редактирования (например, [tableView setEditing:YES animated:NO];
), вам нужно установить tableView.allowsSelectionDuringEditing = YES;
Еще одна ошибка, которую вы могли бы сделать (как и я): если вы установили segue в ячейке, didSelectRowAtIndexPath
не вызывается. Вместо этого вы должны установить свои segues на контроллере вида.
Ни один из этих ответов не работал у меня. Примерно через час я понял что-то очень коварное:
У меня есть представление таблицы внутри ячейки другого вида таблицы. Я решил сделать закрывающий вид, который содержит, помимо всего прочего, внутренний стол. Я назвал это представление contentView и подключил его в xib.
Оказывается, что UITableViewCell уже имеет contentView и делает с ним странные вещи. Проблема разрешилась, когда я переименовал свойство в mainContentView и переподключил представление к этому переименованному свойству.
В моем случае я динамически вычисляю высоту TableView
SuperView
во время загрузки. Из-за просчета, TableView
располагался за пределами SuperView
. TableView
был нарисован отлично, однако все взаимодействия были отключены (и didSelectRowAtIndexPath
никогда не вызывался). Очень трудно обнаружить, так как нет визуальной индикации, что TableView
не "доступен".
В моем случае решение заключалось в том, чтобы изменить NO на YES в следующей функции.
iOS 9 +
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
Хорошо, обновляясь здесь, когда я просто столкнулся с этой проблемой, и моя проблема была немного иной, чем здесь.
Я посмотрел в IB и увидел, что мой делегат WAS установлен, но он был установлен неправильно для VIEW, а не для File Owner (щелкните правой кнопкой мыши по представлению таблицы, чтобы увидеть, куда указывает делегат).
Надеюсь, что кто-то поможет