Question

I have a UITableView in my application where I have custom UITableViewCell which contains a UITextField. What I would like to do is get the correct index of the row when I select a particular textfield from that row. Unfortunately, I am only able to get the correct index of the row if I actually click on the row, and not when I select the textfield itself. I am implementing the <UITextFieldDelegate>, and when I select a particular UITextField, I call the method:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    int rowTest = [_table indexPathForSelectedRow].row;
    int rowTest1 = [_cell.tireCodeField tag];

    NSLog(@"the current row is: %d", rowTest1);
    NSLog(@"and this row is: %d", rowTest);  

    return YES;

}

The problem is that the value for the row that I am getting is from whenever the method:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   ...

}

get's called. It is as if there is a disconnect between the UITextField and the row in the table it resides in. Is there a way for me to select a particular textField, and get the

Is there a way for me to get the index of the row by selecting the UITextField that resides within it, instead of selecting the row itself?

Thanks in advance to all who reply.

Was it helpful?

Solution

The way this is usually done, is to give the text field a tag equal to the indexPath.row, or if you have multiple sections, some mathematical combination of the section and row (like 1000*indexPathSection + indexPath.row).

OTHER TIPS

Well, assuming that the cell is the direct superview or the text field, you can directly ask for the text field's superview, cast to UITableViewCell, and then ask your instance of UITableView for the index path of that cell. Here's an example:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    UITableViewCell *cell = (UITableViewCell *)textField.superview; // cell-->textfield
    //UITableViewCell *cell = (UITableViewCell *)textField.superview.superview; // cell-->contentView-->textfield
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    return YES;
}

If you're looking for a more dynamic solution that works across multiple versions of iOS, then you'll probably want to use the following quoted from @Marko Nikolovski here

// Get the cell in which the textfield is embedded
id textFieldSuper = textField;

while (![textFieldSuper isKindOfClass:[UITableViewCell class]]) {
    textFieldSuper = [textFieldSuper superview];
}

// Get that cell's index path
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)textFieldSuper];

This method crawls up the superview until it encounters a UITableViewCell. This keeps the code working even when the cell's view hierarchy changes, like it did from iOS 6 to 7.

I thought I'd post this slightly (!) late answer as I was trying to do this for ages and then remember another method (which if I say so myself is one of the best ways) of getting the index path for a cell when a UIButton was tapped.

In a similar way you can get the CGPoint of the cell.

-(NSIndexPath *)indexPathForTextField:(UITextField *)textField
{
    CGPoint point = [textField convertPoint:CGPointZero toView:self.tableView];
    return [self.tableView indexPathForRowAtPoint:point];
}

-(void)textDidChangeForTextFieldInCell:(UITextField *)textField
{
    NSIndexPath *indexPath = [self indexPathForTextField:textField];
    // Now you can update the object at indexPath for your model!
}

I think this is far neater than relying on tags or the even yuckier method of looking at superviews!

As it seems you are working with tags,using the UITextFieldDelegate,you can declare this methods in order to select the row.

-(void)textFieldDidBeginEditing:(UITextField *)textField{

int rowTest1 = textField.tag;

[myTableview selectRowAtIndexPath:[NSIndexPath indexPathForRow:rowTest1 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];

}

-(void)textFieldDidEndEditing:(UITextField *)textField{
[textField resignFirstResponder];
}
UITableViewCell *textFieldCell = (UITableViewCell*) [[[textfield superview]superview]superview];
    NSIndexPath *indexPath = [self.editProfileTableView indexPathForCell:textFieldCell];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top