Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITextField inside UITableViewCell: becomeFirstResponder in didSelectRowAtIndexPath

I am currently trying to get this working. Any help is appreciated.

I have a custom UITableViewCell that has a UITextField inside. When I select the table cell, I would like to make the UITextField first Responder.
However [textField becomeFirstResponder]; returns false.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
  UITextField *textField;
  for (UIView *view in [cell subviews]) {
    if ([view isMemberOfClass:[UITextField class]]) {
      textField = ((UITextField *)view);
    }
  }

  [textField becomeFirstResponder];
}

As requested, the initialisation of the textfield. This is done in the UITableViewCell subclass:

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

  if (self) {
    // Init Textfield
    _textField = [[UITextField alloc] init];
    _textField.backgroundColor = [UIColor clearColor];
    _textField.delegate = self;
    [self addSubview:_textField];
  }

return self;
}
like image 999
Sebastian Borggrewe Avatar asked Apr 04 '13 10:04

Sebastian Borggrewe


3 Answers

If you have a custom cell, then you can do something like this:

@implementation CustomCell

#pragma mark - UIResponder

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)becomeFirstResponder
{
    return [self.textField becomeFirstResponder];
}

@end

Then inside the table view delegate:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if ([cell canBecomeFirstResponder]) {
        [cell becomeFirstResponder];
    }
}
like image 83
josh-fuggle Avatar answered Oct 06 '22 17:10

josh-fuggle


Give tag for each UITextField and and use Following code:

UITableViewCell* cell = (UITableViewCell*)sender.superview.superview;
UITextField *txtField = (UITextField*)[cell viewWithTag:tag];
[txtField becomeFirstResponder];

In didSelectRowAtIndexPath method.

Its working very good.. :)

like image 42
iPatel Avatar answered Oct 06 '22 17:10

iPatel


I believe you need to set you textField's delegate property.

Add textField.delegate = self; to your method, before you call [textField becomeFirstResponder]

like image 40
Cezar Avatar answered Oct 06 '22 16:10

Cezar