iOS: Tapping on UITableView does not call didSelectRowAtIndexPath
Solution 1
The resolution is really weird: the UITableViewController registered for all notifications. In the handler for the notifications, the table view data was being reloaded using
[self.tableView reloadData]
According to Apple DTS, when the table reloads data, this causes a notification to be sent to the observer, causing a race condition ...
No explanation for why it would work sometimes or why it would always work on an iPhone. But registering only for a small subset of notifications (i.e. the ones I was really interested in) fixed the problem!
Solution 2
I was having this issue with an app when running in iOS6. The tableView:didSelectRowAtIndexPath:
method was never being triggered, even though it was working before updating to iOS6.
I finally figured it out by looking at the xib and the attribute inspector for the table. In the Table View section I had the Selection option set to No Selection and Show Selection on Touch was not selected.
Changing the Selection option to Single Selection actually got this working for me again and leaving the Show Selection on Touch unselected means that I don't see any flash or change of colour when the row is selected.
Solution 3
I encountered a similar issue. iOS 6
appears to be much more sensitive to the slightest upward movement on a tap on a table view cell. It appears it is registering the slightest movement as a scroll request rather than a cell selection. My table view was set to scrollEnabled = NO
because it is a table view with static selection values. The table view appears within a small area of a larger iPad view. If I carefully tap a cell and lift directly up, the cell is selected.
To resolve it, I changed scrollEnabled
to YES
and made sure the area dedicated to my tableView was larger than the actual area needed to show the table view, thus preventing it from scrolling. Not sure if this is is the cause of the issue you are experiencing, but hope it helps.
Solution 4
I had the same problem. The UITableView was not triggering the didSelectRowAtIndexPath
method when running in iOS6, but it was working fine in iOS5.1.
I had also implemented the
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
and returned NO. In iOS5 it was all working fine, but the minute I switched to iOS6 it would cease to trigger the didSelectRowAtIndexPath
. Once I removed that shouldHighlightRow
method, everything worked in iOS6 again. Cheers!
Solution 5
The usual reason that didSeletRowAtIndexPath()
doesn't get called is having a UITapGestureRecognizer
on your viewcontroller with Cancels touches
in view set to YES
.
The correct and only sensible fix is to set Cancels touches
in view to NO
. Then your table row selection should work nicely.
Obviously this has some implications in your gesture handlers - you may need to add some code to your gesture handler to stop some touches going on to your views i.e.
- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender {
if (sender.view == someOldViewThatINeedToDealWith) {
sender.cancelsTouchesInView = true;
}
}
Anton Meyer
Updated on June 11, 2022Comments
-
Anton Meyer about 2 years
My app uses a
UITableView
with aUINavigationController
to show a more detailed view when a row of the table is tapped - the basic drill-down routine.When I tap on a row, it is highlighted, but the delegate methods
tableView:willSelectRowAtIndexPath:
ortableView:didSelectRowAtIndexPath:
are not called (verified using debugger).Now here's the weird part:
There are some other table views in the app (they don't drill down) and none of them exhibit the issue.
If I tap the row rapidly and repeatedly, after many tries (10 - 20 is normal),
tableView:willSelectRowAtIndexPath:
andtableView:didSelectRowAtIndexPath:
are called and processing continues normally.The problem occurs only on an (any, actually) iPad running iOS 6. It works fine with iPads running iOS 5, or with any iPhone running any iOS version, 6. It also works with the iPad simulator using iOS 5 or 6.
So it seems that something is receiving the tap before the delegate methods are called. But what?
I not using any
UITapGestureRecognizer
, so that is not the issue. I am not using multipleUITableViewControllers
for the table, so this is also not the issue.