Pushing View Controller more than once is not supported?

12,093

Solution 1

When pushing 2 views onto the stack, try to call:

[self.navigationController1 pushViewController:view4 animated:YES];

and

[self.navigationController1 pushViewController://secondviewcontrollername// animated:NO];

If you try to push more than one view with the animated: field set to YES on both, then you confuse the stack. Only animate one view at a time.

Solution 2

just an FYI, if you call setViewControllers:animated: there's no need to call pushViewController: afterwards, else you'll get the "Pushing the same view controller instance more than once is not supported" crash.

Share:
12,093

Related videos on Youtube

SimplyKiwi
Author by

SimplyKiwi

Mobile Tech Lead at SimplyKiwi. Senior iOS Engineer at Rose Digital.

Updated on June 04, 2022

Comments

  • SimplyKiwi
    SimplyKiwi almost 2 years

    I am getting the following error whenever I try to switch views like this:

    -(void)changeView1ToView4 {
        [self.navigationController1 pushViewController:view4 animated:YES];
    }
    

    This doesn't happen when the app first loads and user goes directly to this view. This crash only happens when I go to one of my other views, come back to the main menu, and then try to go to this view.

    Also if you weren't sure already, I am using a UINavigationController. Also this code is in the app delegate and I am calling it from a view controller which has a parent view so I am using a .reference to call it like this:

    [self.reference changeView1ToView4];
    

    Is there any real way to fix this?

    Thanks!

    Edit1:

    [self.navigationController1 pushViewController:view4 animated:NO];
    [self.navigationController1 pushViewController:view4 animated:YES];
    
    I tried that and got this crash message in the console:
    
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported (<View2: 0x18d540>)'
    
  • CodaFi
    CodaFi over 12 years
    Yes. Put the view controller that will be pushed first (obviously the non-animated one) up top, then put the animated one on the bottom. The stack will call the view controller on top, then the view controller on the bottom and the bottom one should be the view that you see. Tell me if it isn't.
  • SimplyKiwi
    SimplyKiwi over 12 years
    Check Edit1 in my original post
  • CodaFi
    CodaFi over 12 years
    AH! I thought you were trying to push 2 DIFFERENT views at once. Why would you need to push a view twice? Just push the view once by deleting one of those methods. Your app should work perfectly.
  • SimplyKiwi
    SimplyKiwi over 12 years
    you mean by just using one of those lines? Thats what I did originally and it is causing this crash.
  • CodaFi
    CodaFi over 12 years
    I see what you're doing wrong! In your method that pushes a viewcontroller, you have to define view4. Like this for example: firstview *first = [[firstview alloc]initiwithnibname:@"firstview" bundle:nil] then release it after the view is pushed:
  • T.J.
    T.J. almost 10 years
    In my situation I was calling two segues one after the other. I changed the first to a push with no animation. Works fine now.