Jason Jason - 6 months ago 91
iOS Question

UITapGestureRecognizer breaks UITableView didSelectRowAtIndexPath

I have written my own function to scroll text fields up when the keyboard shows up. In order to dismiss the keyboard by tapping away from the text field, I've created a

UITapGestureRecognizer
that takes care of resigning first responder on the text field when tapping away.

Now I've also created an autocomplete for the textfield that creates a
UITableView
just below the text field and populates it with items as the user enters text.

However, when selecting one of the entries in the auto completed table,
didSelectRowAtIndexPath
does not get called. Instead, it seems that the tap gesture recognizer is getting called and just resigns first responder.

I'm guessing there's some way to tell the tap gesture recognizer to keep passing the tap message on down to the
UITableView
, but I can't figure out what it is. Any help would be very appreciated.

Answer

Ok, finally found it after some searching through gesture recognizer docs.

The solution was to implement UIGestureRecognizerDelegate and add the following:

////////////////////////////////////////////////////////////
// UIGestureRecognizerDelegate methods

#pragma mark UIGestureRecognizerDelegate methods

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isDescendantOfView:autocompleteTableView]) {

        // Don't let selections of auto-complete entries fire the 
        // gesture recognizer
        return NO;
    }

    return YES;
}

That took care of it. Hopefully this will help others as well.