Return NSIndexPath from custom cell ? (UITableView)

JonasG picture JonasG · Sep 8, 2011 · Viewed 10.9k times · Source

I need to get the NSIndexPath for a custom cell in a UITableView. Here's the problem: I send a NSNotification from my custom cell to my UITableViewController when editingDidBegin gets called from a UITextField in my custom cell. In my UITableViewController, I resize the UITableView when the UITextField began editing, and then want the table view to scroll to the Cell in which the UITextField is first responder. But I can't figure out how to return the indexPath of the cell where the UITextField is being edited. I have tried so many ways, but its still not working. One way is this: in my cstomCell class i select the row using [self setSelected:YES] and in my TV controller then if I NSLog the row of [self.tableV indexPathForSelectedRow] it always returns 0 even though its always not 0.

Answer

ms83 picture ms83 · Sep 8, 2011

Just give the cell a value for its tag property. Then you can get that cell by calling this

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue];

then once you have the cell you can get the NSIndexPath like this

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell];

Since you have a UITextField in your custom cell you can place cell.textField.delegate = self; in the

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

data source method. That way you will not have to setup a NSNotification in the Custom Cell. Also in this same method you can tag both your cells text field like this cell.textField.tag = indexPath.row; and the cell like this cell.tag = indexPath.row;

Now that you have set the UITextField delegate, you can now place this method in your UITableViewController class

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

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];        

}

The above UITextField delegate method should get you the indexPath for the cell you have currently selected.