-didSelectRowAtIndexPath: не вызывается
Я пишу приложение iOS с табличным представлением внутри представления вкладки. В моем UITableViewController
, реализовал -tableView:didSelectRowAtIndexPath:
, но когда я выбираю строку во время выполнения, метод не вызывается. Представление таблицы заполняется, хотя, поэтому я знаю, что другие методы tableView в моем контроллере вызываются.
есть ли у кого-нибудь идеи, что я, возможно, облажался, чтобы это произошло?
30 ответов:
похоже, что, возможно, класс не является
UITableViewDelegate
для этого представления таблицы, хотяUITableViewController
предполагается установить это автоматически.есть шанс, что вы сбросите делегат в какой-то другой класс?
на всякий случай, если кто-то сделал ту же глупую ошибку, что и я:
проверьте, если имя метода, что вы ожидаете быть
didSelect
может случайно получитьdidDeselect
в некотором роде. Мне потребовалось около двух часов, чтобы выяснить ...
еще одна вещь, которая может привести к проблеме не выбран тип выбора:
должно быть
Single Selection
для нормального выбора, должен не бытьNo Selection
.
другая возможность заключается в том, что UITapGestureRecognizer может есть события, как это было здесь:https://stackoverflow.com/a/9248827/214070
Я не подозревал об этой причине, потому что ячейки таблицы все равно будут выделяться синим цветом, как если бы краны проходили.
все хорошие ответы, но есть еще один, чтобы высматривать...
(особенно при создании 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
, else-tableView:didSelectRowAtIndexPath:
не называют.
Если вы добавили gestureRecognizer поверх UITableView,
didSelectRowAtIndexPath
не будет вызван.поэтому вам нужно использовать метод делегирования gestureRecognizer, чтобы избежать касания в конкретном представлении.
- (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; }
Он должен возвращать да для строки, чтобы сделать его выбранным.
в случае, если у вас такая же проблема как и у меня: По-видимому, этот метод не будет вызван, если ваш tableView находится в режиме редактирования. Вы должны установить allowsSelectionDuringEditing в true.
через это вопрос: при редактировании `UITableView ' не вызывает didSelectRowAtIndexPath ??
у меня была такая же проблема,
причиной было использование
UITapGestureRecognizer
. Я хотел, чтобы клавиатура отключалась, когда я стучал в другом месте. Я понял, что это переопределяет все действия крана, поэтому,didSelectRowAtIndexPath
функция не вызывалась.когда я комментирую строки, связанные с
UITapGestureRecognizer
, Он работает. Кроме того, вы можете проверить в функцииUITapGestureRecognizer selector
Если прослушиваютUITableViewCell
или нет.
Я поставил
UITapGestureRecognizer
на мой вид таблицы, чтобы уволить клавиатуру, которая помешалаdidSelectRowAtIndexPath:
вызывается. Надеюсь, это кому-то поможет.
несмотря на то, что другой ответ был принят, я добавлю еще одну возможную проблему и решение для людей, которые наблюдают за этой проблемой:
Если у вас включен автоматический подсчет ссылок (ARC), вы можете обнаружить, что даже после назначения вашего контроллера в качестве делегата представления сообщения представления контроллеру не принимаются, потому что ARC удаляет контроллер. По-видимому, указатель делегата UITableView не считается ссылкой на дугу, поэтому если это это единственная ссылка на него, контроллер будет dealloc бы. Вы можете проверить, является ли или не это происходит путем внедрения метода dealloc на контроллер и установка точки останова или NSLog вызов.
решение состоит в том, чтобы отслеживать контроллер с сильной ссылкой где-то еще, пока вы не будете уверены, что он вам больше не понадобится.
Не забудьте установить источник данных и делегировать в методе viewDidLoad следующим образом:
[self.tableView setDelegate:self]; [self.tableView setDataSource:self];
моя проблема не была ни одной из вышеперечисленных. И такой хромой. Но я подумал, что перечислю его здесь, если это кому-то поможет.
у меня есть
tableViewController
Это мой" базовый " контроллер, а затем я создаю подклассы этого контроллера. Я писал весь свой код вtableView:didSelectRowAtIndexPath
рутина в "базовом" классе. Полностью забывая, что по умолчанию эта процедура также была создана (хотя и без кода, который ничего не делал) во всех моих подклассах. Поэтому, когда я запустил свое приложение, он запустил подкласс версия кода, ничего не сделал, и мне стало грустно. Поэтому, конечно, как только я удалил процедуру из подклассов, он использовал Mt "базовый" класс, и я в бизнесе.Я знаю. Не смейтесь. Но, может быть, это спасет кого-то от потерянного часа...
отдавая мои 2 цента на это.
У меня был пользовательский UITableViewCell и была кнопка, охватывающая всю ячейку, поэтому, когда произошло касание, была выбрана кнопка, а не ячейка.
либо удалить кнопку, либо в моем случае, я установил взаимодействие с пользователем включить false на кнопке, таким образом, ячейка была выбрана.
Если Вы читаете это, так до сих пор не решает проблему.
У меня есть custom ячейки, где чекбокс "Взаимодействие С Пользователем Включено" был отключить. Так что я просто включаю его. Удача.
у меня просто было это, и, как это случилось со мной в прошлом, это не сработало, потому что я не обращал внимания на автозаполнение при попытке добавить метод, и я на самом деле заканчиваю реализацию
tableView:didDeselectRowAtIndexPath
: вместоtableView:didSelectRowAtIndexPath:
.
Если ваш вид таблицы в режиме редактирования (например.
[tableView setEditing:YES animated:NO];
), вам нужно установитьtableView.allowsSelectionDuringEditing = YES;
Я знаю, что это старый, и проблема была решена, но у меня была аналогичная проблема, я думал, что проблема была с моим пользовательским UITableViewCell, но решение было совершенно другим - я перезапускаю XCode :) а затем работает нормально ! почти как Windows :)
еще одна ошибка, которую вы могли бы сделать (как и я): если вы установите segue в ячейке,
didSelectRowAtIndexPath
Это не называется. Вместо этого вы должны установить свои сегменты на контроллере вида.
ни один из этих ответов работал для меня. Примерно через час я понял кое-что очень коварное:
У меня есть таблица внутри ячейки другой вид таблицы. Я решил сделать заключительный вид, который содержит внутренний вид таблицы, среди прочего. Я назвал это представление contentView и подключил его в xib.
оказывается, что UITableViewCell уже имеет contentView и делает странные вещи с ним. Проблема разрешилась сама собой, когда я переименовал свойство в mainContentView и повторно подключил представление к этому переименованному свойству.
в моем случае решение состояло в том, чтобы изменить нет на Да в приведенной ниже функции.
iOS 9+
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }
ОК, обновление здесь, как я только что столкнулся с этой проблемой, и мой вопрос был несколько иной, чем здесь.
Я посмотрел в IB и увидел, что мой делегат был установлен, но он был установлен неправильно для просмотра вместо владельца файла (щелкните правой кнопкой мыши на табличном представлении, чтобы увидеть, куда указывает делегат).
надеюсь, что это поможет кому-то
в моем случае, я динамически рассчитать высоту
TableView
' sSuperView
во время загрузки. Из-за просчета, тоTableView
находился за пределамиSuperView
. ЭлементTableView
был нарисован нормально, однако все взаимодействие было отключено (иdidSelectRowAtIndexPath
никогда не называлось). Очень трудно обнаружить, так как нет никаких визуальных признаков того, чтоTableView
Не "можно".