Rob
Rob

Reputation: 426

How do I resignFirstResponder when I click outside of a UITextField onto a UITableView

I am having trouble getting the keyboard in my iPhone app to go away because the UIView even when made a controller is not touchable because of the fact that I have a UITableView taking up the rest of the available screen.

I was curious to know how I would go resigning the keyboard aka firstResponder by clicking onto the UITableView? Is there a way to monitor a touch event on the UITableView even if it is not to select a clickable cell.

Basically, I know how to resign the keyboard if the cell fires the event but, if I click on a non - clickable part of the UITableView I would still like the keyboard to go away.

Upvotes: 6

Views: 4671

Answers (4)

rmartinsjr
rmartinsjr

Reputation: 569

Adding a tap gesture recognizer is an interesting solution, but there's an alternative and you don't need to code anything!

You can set in Interface Builder the property keyboardDismissMode to "Dismiss on drag" for your table view. It's a property inherited from UIScrollView and whenever you scroll your table view, the keyboard is dismissed.

Upvotes: 4

Ramesh
Ramesh

Reputation: 1763

@property (weak, nonatomic) UITextField *activeTextField; // keeps track of whose keyboard is being displayed.

- (void)textFieldDidBeginEditing:(UITextField *)textField {
   self.activeTextField = textField;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   // if (indexPath equal to something then)
   [self.activeTextField resignFirstResponder];
}

Upvotes: 0

Jhanvi
Jhanvi

Reputation: 5139

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    UITapGestureRecognizer *doubleTap = 
            [[UITapGestureRecognizer alloc]
             initWithTarget:self 
             action:@selector(tapDetected:)];
            doubleTap.numberOfTapsRequired = 1;
            [self.tableView addGestureRecognizer:doubleTap];
            [doubleTap release];

    }

 - (IBAction)tapDetected:(UIGestureRecognizer *)sender 
 {
    CGPoint p = [sender locationInView:self.tableView];

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];

   if(indexPath == nil)
   {
     NSLog(@"empty");
   }
   else
   {
     [textField resignFirstResponder];
   }
 }

I think it will help... try it..

Upvotes: 3

Gilad Novik
Gilad Novik

Reputation: 4604

2 options:

  • In your viewController, respond to the table's scroll callback and resign the responder
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
     [self.view endEditing:YES];
}
  • You can always add a UITapGestureRecognizer to the table/view and resign the responder from there

Personally I usually do it on table scroll, since I don't like a single tap to dismiss the keyboard.

Upvotes: 6

Related Questions