Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find indexPath for tapped accessory button in tableView

I've simple UITableView with one section and few rows. When user clicks cell accessory button (which is connected with detailsSegue. I want to know what cell row was it. So than I can select right object from my array and assign it to the variable from the next view.

I have used delegate method tableview:accessoryButtonTappedForRowWithIndexPath: and assigned indexPath value to my private property myRow. Than in prepareForSegue:sender: method I used my self.myRow.row value to select right object from array.

My problem is that these two methods seems to execute in wrong order. From the NSLog I can see that prepareForSegue:sender: method is executed first and my delegate method is changing value of self.myRow after it.

So prepareForSegue:sender: method is always passing wrong object to the next view (the one that was tapped previously).

Sorry for my english guys. Thanks for help in advance.

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    self.myRow = indexPath;
    NSLog(@"tapped button at row: %i",self.myRow.row); 
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"addSegue"]) {
        AddViewController *avc = segue.destinationViewController;
        avc.delegate = self;
    }
    else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
        NSLog(@"Segue row: %i",self.myRow.row);
        Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row];
        NSLog(@"Segue annotation object: %@",annotation.title);
        DetailsViewController *dvc = segue.destinationViewController;
        dvc.wikiKey = annotation.title;
    }
}
like image 796
Guferos Avatar asked Dec 03 '12 19:12

Guferos


People also ask

How do you get the IndexPath row when a button in a cell is tapped Objective C?

add an 'indexPath` property to the custom table cell. initialize it in cellForRowAtIndexPath. move the tap handler from the view controller to the cell implementation. use the delegation pattern to notify the view controller about the tap event, passing the index path.

What is IndexPath in Tableview Swift?

Swift version: 5.6. Index paths describe an item's position inside a table view or collection view, storing both its section and its position inside that section.

What is IndexPath section?

An index number identifying a row in a UITableView object in a section identified by section. section.


1 Answers

As you have discovered, the system sends you the prepareForSegue:sender: message before it sends you the tableview:accessoryButtonTappedForRowWithIndexPath: message.

But, when it sends you the prepareForSegue:sender: message, the sender argument is the UITableViewCell containing the accessory view. You can use that to determine which row's accessory button was tapped:

else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row];
    DetailsViewController *dvc = segue.destinationViewController;
    dvc.wikiKey = annotation.title;
}
like image 166
rob mayoff Avatar answered Nov 05 '22 00:11

rob mayoff