I dropped a UITableView
onto the UIView
which is contained within my UIScrollView
. I've got the delegate and data source set to my UIViewController
, but I notice that the tableView:didSelectRowAtIndexPath
method isn't being called. I don't have touchesBegan
or any other touches* method overridden. I tried the 4th answer here: UIScrollView touchesBegan subclassing my UIScrollView
but the method is still never called. The table cells are populated correctly though.
Asked
Active
Viewed 1,426 times
3
-
post some code about how you add your tableview? – johnMa Jan 11 '14 at 09:03
-
Check user interaction of uitableView. It should be enabled?? – Hussain Shabbir Jan 11 '14 at 09:31
2 Answers
4
Dont implement any UITapGestureRecognizer on UIScrollView. or touchesBegan in UIScrollView Class. and it will work.

Zeeshan
- 4,194
- 28
- 32
-
Ah, didn't realize that the tap gesture recognizer would be the culprit. Sooooo since I actually need this tap gesture recognizer, is there a way to make them both work? – Architekt Jan 11 '14 at 21:52
-
1- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return ![NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]; } – Zeeshan Jan 12 '14 at 16:31
-
2
Do I understand correctly that the UITableView
is a subview of a UIView
, and that the UIView
is a subview of a UIScrollView
?
For what it's worth, this worked fine in my iOS 7 simulator (I was receiving the -tableView:didSelectRowAtIndexPath:
messages). Here's a view controller you can use to test out my implementation.
@interface ContainedScrollersViewController () <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) UIScrollView *scrollView;
@property (strong, nonatomic) UIView *tableViewContainer;
@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) NSMutableArray *values;
@end
@implementation ContainedScrollersViewController
- (id)init
{
self = [super init];
if (self) {
int countValues = 20;
_values = [[NSMutableArray alloc] initWithCapacity:countValues];
for (int i = 0; i < countValues; i++) {
[_values addObject:@(arc4random() % 100)];
}
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_scrollView = [[UIScrollView alloc] init];
_scrollView.backgroundColor = [UIColor grayColor];
_tableViewContainer = [[UIView alloc] init];
_tableViewContainer.backgroundColor = [UIColor lightGrayColor];
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_scrollView];
[_scrollView addSubview:_tableViewContainer];
[_tableViewContainer addSubview:_tableView];
}
- (void)viewDidLayoutSubviews
{
self.scrollView.frame = self.view.bounds;
// arbitrary sizes to visualize each view in the hierarchy
self.scrollView.contentSize = CGSizeMake(640.0f, 960.0f);
self.tableViewContainer.frame = CGRectMake(0.0f, 0.0f, 400.0f, 600.0f);
self.tableView.frame = self.view.bounds;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.values.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [NSString stringWithFormat:@"%@", [self.values objectAtIndex:indexPath.row]];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"selected row:%i", indexPath.row);
}
@end

Joseph Chen
- 1,520
- 13
- 21