lylej86
lylej86

Reputation: 41

Pushing Data from UITableViewCell to ViewController

I am trying to push data from a UITableViewCell into another view controller. I have tried two separate ways, instantiateViewControllerWithIdentifier and also PrepareForSegue. In both instances the ViewController loads correctly but the data is not being passed across (either null, or the first array value).

Here is my instantiateViewControllerWithIdentifier method, when I log the variable within my ViewController it just returns null.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *testNumber = [jobNumberArray objectAtIndex:indexPath.row];
NSLog(@"Job is... %@",testNumber);
StandardInfoViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"StandardInfoViewController"];
controller.JobNr = [jobNumberArray objectAtIndex:indexPath.row];
[self.navigationController pushViewController:controller animated:YES];
} 

Prepare For Segue

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"Details" sender: self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"Details"]){
    StandardInfoViewController *controller = (StandardInfoViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    controller.jobNumber = [jobNumberArray objectAtIndex:indexPath.row];
}
}

When I use the prepareForSegue call I get the first row of my Array, which I understand because it doesn't know the cell, but I don't know how to identify the Cell within the prepareForSegue call.

I hope this makes sense, and any help or pointers would be greatly appreciated.

Thanks

Upvotes: 3

Views: 1416

Answers (2)

Prajeet Shrestha
Prajeet Shrestha

Reputation: 8108

Is this what you want?

This is how you identify Cell in prepareForSegue method.

    **UITableViewCell *cell=[myTable cellForRowAtIndexPath:path];**

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"Details"]){
    StandardInfoViewController *controller = (StandardInfoViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

    **UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath];**
    controller.jobNumber = [jobNumberArray objectAtIndex:indexPath.row];
}
}

Upvotes: 0

ullstrm
ullstrm

Reputation: 10160

If you drag the segue FROM the tableView-cell in the storyboard, you will then get the cell itself as parameter sender.

then you can use tableView indexPathForCell:sender to get the actual index of the selected cell. Then just fetch your object normally.

I.e. you will not need to implement didSelectRowAtIndexPath


If you still want to use didSelectRowAtIndexPath, just pass the cell as the sender parameter manually. I.e:

 [self performSegueWithIdentifier:@"Details" 
                      sender:[self.tableView cellForRowAtIndexPath:indexPath]]

Although your first version with instansiateViewController should work, judging by your code.


Another pattern is to subclass the cells themselves, and let them have a property that is the object that they want to display. Then you can just fetch the object directly from the cell without calling the data-array itself.

Upvotes: 2

Related Questions