I use the method performSegueWithIdentifier:sender: to open a new ViewController from a storyboard-file programmatically. This works like a charm.<
I faced this problem today and what I have done is to create the view controller manually and store it's reference. Then every time I need the controller, check first if exists. Something like this:
MyController *controller = [storedControllers valueForKey:@"controllerName"];
if (!controller)
{
controller = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:NULL] instantiateViewControllerWithIdentifier:@"MyControllerIdentifierOnTheStoryboard"];
[storedControllers setValue:controller forKey:@"controllerName"];
}
[self.navigationController pushViewController:controller animated:YES];
Hope it helps.