Search code examples
iosiphoneobjective-cuistoryboardsegue

Invoking push segue programmatically and prepareforsegue method


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?


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
                }
            }
        }
    }