Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

prepareForSegue **always** creates a new destinationViewController?

I Just realized that the following code always creates a new TagsFeedViewController. Is this the default behavior of segues? Is there a way to configure iOS to not create a new destinationViewController every time?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showSearchResult"]) {
        TagsFeedViewController *destViewController = segue.destinationViewController;
        destViewController.query = query;
    }
}
like image 555
disappearedng Avatar asked Apr 07 '13 23:04

disappearedng


2 Answers

Segues use whichever view controllers are provided to their – initWithIdentifier:source:destination: methods. It's not the segue that creates the destination view controller, but the storyboard. From the docs:

Normally, view controllers in a storyboard are instantiated and created automatically in response to actions defined within the storyboard itself.

So you have some options:

  • Subclass UIStoryboard. Probably a bad idea. The public interface for UIStoryboard has only three methods; the "actions defined within the storyboard itself" aren't public, and I don't think there's enough information available to let you do the job right.

  • Make your destination view controller a singleton. Also a bad idea. Aside from the general badness that singletons bring with them, you shouldn't need to keep a view controller that has no views and no child view controllers around. And making your view controller class a singleton just to fool UIStoryboard into using a particular instance of your view controller class seems kinda icky.

  • Subclass UIStoryboardSegue. If you create your own segues, you can do what you like in – initWithIdentifier:source:destination:, including ignoring the provided destination view controller and using the one you want instead. This still seems like working against the framework, and that's usually a poor plan, but if you absolutely must use a particular instance of your destination view controller this seems like a better way to go.

  • Go with the flow. Best option. Think about the reason that you're hoping to segue to an existing view controller. Consider whether there might be better ways to accomplish what you want without having to subvert the framework. For example, do you want to use an existing view controller because it already has some particular state? Maybe it'd be better to maintain that state in your model and not in the view controller.

like image 54
Caleb Avatar answered Sep 27 '22 19:09

Caleb


Yes, This is the default behavior for segues. See this post for more information.

like image 45
codeqi Avatar answered Sep 27 '22 19:09

codeqi