I am still new to the storyboard stuff. I spent two days debugging this problem. It seems the destination view controller of a segue is not working properly when the -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender is called.
I have a table view and when a cell is tapped, it calls for a segue
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
VAItem *item = [category itemAtIndex:indexPath.row];
[self performSegueWithIdentifier:@"SegueShowDetail" sender:item];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {
VADetailViewController *detailViewController = segue.destinationViewController;
detailViewController.item = (VAItem*) sender; // <-- THIS ASSIGNMENT DOES NOT WORK
}
}
My debugging shows, the item is correctly passed down to prepareForSegue but the detailViewController.item is a wild pointer. It’s not initialized and the = assignment does not have any effect.
I put a breakpoint in VADetailViewController’s viewDidLoad and found out that the item variable is still the wild pointer address even though the assignment has taken place.
@interface VADetailViewController : UIViewController
// data
@property (nonatomic, retain) VAItem *item;
@end
item is also correctly synthesized.
Any help is much appreciated
Leo
If you’re using a storyboard segue to transition to the next viewcontroller you don’t need to use
tableVeiew:didSelectRowAtIndexPath:in this situation. Depending how you have things set up that could be contributing to the problem.In your storyboard, make sure you have drawn your push segue from your tableview’s Prototype Cell to the detail view controller (i.e. from the cell, NOT from the tableViewController). If you have your storyboard set up that way your segue will be triggered as soon as the user selects a cell. A reference to the cell itself will be passed to
prepareForSegue:sender:as thesenderparameter. You can then inspect that object to find out which row was clicked in that method.