Я пишу приложение для iOS с табличным представлением внутри представления вкладок. По моему UITableViewController
, я реализовал -tableView:didSelectRowAtIndexPath:
, но когда я выбираю строку во время выполнения, метод не вызывается. Однако табличное представление заполняется, поэтому я знаю, что в моем контроллере вызываются другие методы tableView.
У кого-нибудь есть идеи, что я, возможно, облажался, чтобы это произошло?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
источник
источник
UITableView
?-didSelectRowAtIndexPath
. Я разобрался с шляпой, потому что у меня есть распознаватель жестов касания на виде таблицы, и этот жест должен потерпеть неудачу прежде, чем получит касание. Хотя это странно, анимация выбора таблицы не зависит от распознавателя жестов.Ответы:
Похоже, что класс не предназначен
UITableViewDelegate
для этого табличного представления, хотяUITableViewController
должен устанавливать его автоматически.Есть ли шанс, что вы сбросите делегат в какой-то другой класс?
источник
На всякий случай кто-то сделал ту же самую глупую ошибку, что и я:
Проверьте, можно ли
didSelect
случайно получить имя метода того, кем вы ожидаете бытьdidDeselect
. Мне потребовалось около двух часов, чтобы выяснить ...источник
Еще одна вещь, которая может привести к проблеме, это не выбор вида:
Должно быть
Single Selection
для нормального выбора, не должно бытьNo Selection
.Чтобы сделать это программно, выполните:
источник
Другая возможность состоит в том, что UITapGestureRecognizer может есть события, как здесь: https://stackoverflow.com/a/9248827/214070
Я не подозревал эту причину, потому что ячейки таблицы по-прежнему будут выделены синим цветом, как если бы краны проходили.
источник
didSelectRowAtIndexPath
не работает только после удаления ячейки вcommitEditingStyle
. Затем я делаюUITapGestureRecognizer
иtapAction:
получил получилindexPath
отsender.view
([self.tableView indexPathForCell:sender.view]
) и колл[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Все хорошие ответы, но есть еще один, чтобы высматривать ...
(Особенно при программном создании UITableView)
Убедитесь, что tableView может реагировать на выбор, устанавливая
[tableView setAllowsSelection:YES];
или удаляя любую строку, которая устанавливает егоNO
.источник
setAllowsSelectionDuringEditing:
в список (когда просмотр таблицы в режиме редактирования)Single Selection
.Если проблема возникает с
UITapGestureRecognizer
вами, вы можете исправить это:в коде с
Objective-C
:в коде с
Swift
:источник
Я столкнулся с двумя вещами в этой ситуации.
Возможно, вы забыли реализовать протокол UITableViewDelegate, или нет выхода делегирования между вашим классом и табличным представлением.
У вас может быть UIView внутри вашей строки, который является первым респондентом и убирает ваши клики. Скажите UIButton или что-то подобное.
источник
У меня была такая же проблема. И это было трудно найти. Но где-то в моем коде было это:
Должно быть
return indexPath
, иначе-tableView:didSelectRowAtIndexPath:
не называется.источник
Если вы добавили gestRecognizer поверх UITableView,
didSelectRowAtIndexPath
вызываться не будет.Таким образом, вам нужно использовать метод делегата gestRecognizer, чтобы избежать касания в конкретном представлении.
источник
if ([touch.view isDescendantOfView:YourTable])
Я столкнулся с проблемой, когда после нескольких месяцев не глядя на мой код, я забыл, что реализовал следующий метод из-за некоторых требований, которые не были необходимы
Он должен возвращать YES для строки, чтобы сделать ее выбранной.
источник
ВЫ ДОЛЖНЫ выбрать эти варианты
но если вы хотите, чтобы
UITableView
при нажатии кнопки не выделялись, вам следует внести изменения вUITableViewCell
свойства.Выберите «Нет» для выбора, как показано ниже
источник
Я положил
UITapGestureRecognizer
на свое табличное представление, чтобы отклонить клавиатуру, которая препятствовала тому,didSelectRowAtIndexPath:
чтобы быть вызванным. Надеюсь, это кому-нибудь поможет.источник
Если у вас возникла та же проблема, что и у меня: очевидно, этот метод не будет вызываться, если ваш tableView находится в режиме редактирования. Вы должны установить для allowSelectionDuringEditing значение true.
С помощью этого вопроса: при редактировании `UITableView` не вызывает didSelectRowAtIndexPath ??
источник
У меня такая же проблема,
Причиной было использование
UITapGestureRecognizer
. Я хотел, чтобы клавиатура отклонялась, когда я нажимал в другом месте. Я понял, что это отменяет все действия крана, поэтомуdidSelectRowAtIndexPath
функция не вызывается .Когда я комментирую строки, связанные с
UITapGestureRecognizer
, это работает. Кроме того, вы можете проверить в функции,UITapGestureRecognizer selector
если постучалUITableViewCell
или нет.источник
В моем случае не вызывал didSelctRowAtIndexPath из-за того, что я не выбрал ни одного в свойстве Selection таблицы tableView, установка единственного выбора решила мою проблему
источник
Для Xcode 6.4, Swift 1.2. Выбор «тег» был изменен в IB. Я не знаю как и почему. Установка этого параметра на «Единый выбор» позволила снова выбрать ячейки моего табличного представления.
источник
Несмотря на то, что был принят другой ответ, я добавлю еще одну возможную проблему и решение для людей, которые наблюдают за этой проблемой:
Если у вас включен автоматический подсчет ссылок (ARC), вы можете обнаружить, что даже после назначения контроллера в качестве делегата представления сообщения представления на контроллер не принимаются, поскольку ARC удаляет контроллер. Очевидно, указатель делегата UITableView не считается ссылкой для ARC, поэтому, если это единственная ссылка на него, контроллер будет освобожден. Вы можете проверить, происходит ли это, реализуя метод dealloc на контроллере и устанавливая точку останова или вызов NSLog там.
Решение состоит в том, чтобы отслеживать контроллер с сильной ссылкой где-то еще, пока вы не будете уверены, что он вам больше не понадобится.
источник
Не забудьте установить источник данных и делегировать в методе viewDidLoad следующим образом:
источник
Моей проблемой не было ничего из вышеперечисленного. И так хромает. Но я думал, что перечислю это здесь на случай, если это кому-нибудь поможет.
У меня
tableViewController
есть «базовый» контроллер, а затем я создаю подклассы этого контроллера. Я писал весь свой код вtableView:didSelectRowAtIndexPath
подпрограмме в «базовом» классе. Полностью забыв, что по умолчанию эта подпрограмма также была создана (хотя и без кода, который что-либо делал) во всех моих подклассах. Поэтому, когда я запустил свое приложение, оно запустило версию кода для подклассов, ничего не сделало и огорчило меня. Поэтому, разумеется, когда я удалил подпрограмму из подклассов, она использовала подпрограмму класса «mt», и я в деле.Я знаю. Не смейся Но, возможно, это спасет кого-то за час, который я потерял ...
источник
Давая мои 2 цента на это.
У меня был Custom UITableViewCell, и была кнопка, покрывающая всю ячейку, поэтому, когда произошло касание, была выбрана кнопка, а не ячейка.
Либо удалите кнопку, либо в моем случае я установил для кнопки «Интеграция пользователя» значение «ложь», чтобы была выбрана ячейка.
источник
Если вы читаете это, значит, проблема не решена.
У меня есть пользовательская ячейка, где флажок « Взаимодействие с пользователем включено » был отключен. Итак, я просто включаю его. Удачи.
источник
У меня просто было это, и, как это случилось со мной в прошлом, это не сработало, потому что я не обращал внимания на автозаполнение при попытке добавить метод и фактически заканчивал тем, что реализовал
tableView:didDeselectRowAtIndexPath
: вместоtableView:didSelectRowAtIndexPath:
.источник
Убедитесь, что вы реализовали,
tableView:didSelectRowAtIndexPath
а неtableView:didDeSelectRowAtIndexPath
Это было получено мной не раз!
источник
Я знаю, что старый, и проблема была решена, но была похожая проблема, я думал, что проблема была с моим пользовательским UITableViewCell, но решение было совершенно другим - я перезагружаю XCode :) и затем работает нормально! почти как винда :)
источник
Если ваш табличный вид находится в режиме редактирования (например,
[tableView setEditing:YES animated:NO];
), вам необходимо установитьtableView.allowsSelectionDuringEditing = YES;
источник
Еще одна ошибка, которую вы могли бы сделать (как и я): если вы установите переход на камеру,
didSelectRowAtIndexPath
не называется. Вместо этого вы должны установить свои сегменты на контроллере вида.источник
Ни один из этих ответов не работал для меня. Примерно через час я понял что-то очень коварное:
У меня есть вид таблицы внутри ячейки другого вида таблицы. Я решил сделать вложение, которое, помимо прочего, содержит внутреннее табличное представление. Я назвал это представление contentView и подключил его в xib.
Оказывается, что UITableViewCell уже имеет contentView и делает с ним странные вещи. Проблема разрешилась, когда я переименовал свойство в mainContentView и снова подключил представление к этому переименованному свойству.
источник
В моем случае, я динамически вычислять высоту
TableView
«сSuperView
во время загрузки. Из-за просчета,TableView
был расположен за пределамиSuperView
. ОбъектTableView
был нарисован нормально, однако все взаимодействие было отключено (иdidSelectRowAtIndexPath
никогда не вызывалось) Очень трудно обнаружить, так как нет визуальной индикации того, чтоTableView
он «недоступен».источник
В моем случае проблема заключалась в том, что у меня был
UITableViewCell
подкласс, и я реализовал эти два метода:touchesBegan:withEvent:
&touchesEnded:withEvent
для обработки необычной анимации на ощупь. Но я забыл добавить[super touchesBegan:touches withEvent:event];
метод объявления,[super touchesEnded:touches withEvent:event];
чтобы сообщить родителю ячейки о касании.Поэтому изменение кода на следующее решило мою проблему:
источник
В моем случае решение состояло в том, чтобы изменить НЕТ на ДА в приведенной ниже функции.
iOS 9+
источник