Invoking push segue programmatically and prepareforsegue method

ios, iphone, objective-c, segue, uistoryboard

Solution

Call `performSegueWithIdentifier`: from your `didSelectRowAtIndexPath` method

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    NSLog(@"segue from deals screen");
    //addToCartViewContollerForItem
    if([[segue identifier] isEqualToString:@"addToCartSegue"]){
        NSIndexPath *selectedRow = [[self tableView] indexPathForSelectedRow];

        Item *currentItem = [[Item alloc]init];
        currentItem = [itemList objectAtIndex:[selectedRow row]];

        RESTAddToCartViewController *vc = [segue destinationViewController];
        [vc setCurrentItem:currentItem];
    }

}

in Swift 2.3

//MARK: didSelectRowAtIndexPath

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("addToCartSegue", sender: self)
}


// MARK: - Navigation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    if segue.identifier == "addToCartSegue" {
        let selectedIndexPath = self.tableView.indexPathForSelectedRow
        let currentItem: Item = itemList[selectedIndexPath.row]
        if let viewcontroller = segue.destinationViewController as? RESTAddToCartViewController {
            viewcontroller.currentItem = currentItem
        }
    }
}

Swift 3

//MARK: didSelectRowAtIndexPath

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "addToCartSegue", sender: self)
}

// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "addToCartSegue" {
        if let selectedIndexPath = self.tableView.indexPathForSelectedRow {
            let currentItem: Item = itemList[selectedIndexPath.row]
            if let viewcontroller = segue.destination as? RESTAddToCartViewController {
                viewcontroller.currentItem = currentItem
            }
        }
    }
}

Problem

I'm invoking `push segue` programmatically as below ``` UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"addToCartViewContollerForItem"]; [self.navigationController pushViewController: vc animated:YES]; ``` but my problem is I want to send some info with this segue to the destination viewcontroller. But the method `- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender` is not getting fired at all. this is how the prepareforsegue method ``` - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. NSLog(@"segue from deals screen"); //addToCartViewContollerForItem if([[segue identifier] isEqualToString:@"addToCartSegue"]){ NSIndexPath *selectedRow = [[self tableView] indexPathForSelectedRow]; Item *currentItem = [[Item alloc]init]; currentItem = [itemList objectAtIndex:[selectedRow row]]; RESTAddToCartViewController *vc = [segue destinationViewController]; [vc setCurrentItem:currentItem]; } } ``` What am I missing here?

Original source

Related problems