iOS 7 error Warning: Attempt to dismiss from view controller <UINavigationController: 0x1568db40> while a presentation or dismiss is in progress

16,872

Solution 1

I'm surprised that you wouldn't see this same problem in previous versions of Xcode, because I think your problem is calling dismissViewControllerAnimated:completion: in the "done" method. This should have been a problem in iOS 6 as well. The unwind segue does the dismissal for you, so you shouldn't call this method yourself. Try commenting it out, and see if that fixes the problem.

Solution 2

I had this very same problem in only iOS 7, too.

My problem was to call methods that works on the UI (like showing UIAlertView etc.) on the viewWillAppear: method. That was quite wrong because when one view was being dismissed, another view was appearing so both UI methods were being called.

I have moved my methods to viewDidAppear: method and the problem have been fixed.

Solution 3

Recheck your code. You have an animation that hasn't completely finished prior to firing another animation transition. I had the same issues and tracked it down to multiple animations slightly overlapping. Set dismissViewControllerAnimated:NO and you'll see what I mean.

Share:
16,872
Darrell
Author by

Darrell

Updated on June 04, 2022

Comments

  • Darrell
    Darrell almost 2 years

    I have issue in iOS 7 that does not appear in iOS 6.

    I have a navigation controller that is displaying another navigation controller to add an employee. This second controller is being presented modally. When I dismiss the second controller either with a "Cancel" or "Done" button, I get an error. Here is the error:

    QuickSchedule[880:60b] Warning: Attempt to dismiss from view controller while a presentation or dismiss is in progress!

    I am using an unwind segue and dismissing from the first controller using the following relevant code.

    This is in ScheduleViewController.m (My main controller window)

    - (IBAction)done:(UIStoryboardSegue *)segue
    {
        if ([[segue identifier] isEqualToString:@"DoneEditing"]) {
            [[MyManager sharedManager] saveChanges];
            [self dismissViewControllerAnimated:YES completion:NULL];
        }
    }
    

    The connection in the connection inspector for the "Done" button is simply "action -> [unwind done:]"

    I had no errors before upgrading to Xcode 5. This all started after upgrading Xcode and my storyboard to iOS 7.

    I am getting same error in different spot in my app, but again, it's with a modally presented view controller.

    I go from EmployeeViewController to AddEmployeeViewController modally. I get the error again when I return from AddEmployeeViewController.

    EmployeeViewController.m

    - (IBAction)done:(UIStoryboardSegue *)segue
    {
        if ([[segue identifier] isEqualToString:@"ReturnInput"]) {
            AddEmployeeViewController *addController = [segue sourceViewController];
            if (addController.employee) {
                [[MyManager sharedManager] saveChanges];
                [[self tableView] reloadData];
            }
            if (![self.presentedViewController isBeingDismissed]) {
                [self dismissViewControllerAnimated:YES completion:nil];
            }
        }
    }
    
    - (IBAction)cancel:(UIStoryboardSegue *)segue
    {
        if ([[segue identifier] isEqualToString:@"CancelInput"]) {
            [self dismissViewControllerAnimated:YES completion:NULL];
        }
    }
    

    Here is AddEmployeeViewController.m

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([[segue identifier] isEqualToString:@"ReturnInput"]) {
            if ([self.firstNameField.text length] || [self.lastNameField.text length]) {
    
                Employee *newEmployee = [[MyManager sharedManager] createEmployeeWithFirstName:self.firstNameField.text andLastName:self.lastNameField.text];
                [[MyManager sharedManager] addEmployeeToList:newEmployee];
                self.employee = newEmployee;
            }
        }
    }
    

    I am still learning, and I have looked for hours online and cannot find an answer to this. I have tried putting the "saving code" in a completion block. I put it back and tried using nil instead of NULL in the completion block argument. As you can see, I have nil in one spot on a completion block argument and NULL on another. No matter what, the error keeps appearing.

    Everything works as far a functionality, I just get this error logged to the console. Any help is greatly appreciated.

    Note: I do not get this error with regular pushed navigation controllers. This is only happening on dismissing modally presented view controllers.