Unable to get presentViewController to work

61,390

Solution 1

If ViewController is the root view controller, it can't present a modal view controller from within its own viewDidLoad, because at that point it doesn't have information like the screen size.

If other view controllers have already displayed, this will work. If the root view controller is a UINavigationController, you will see a view sliding in from the right while the modal view slides up from the bottom.

Anyway, for your ViewController, the soonest you could present it is after it has become visible. Using a timer for this is unreliable; older and slower devices have dramatically longer load times.

For more reliability, implement viewDidAppear: for ViewController. Do still use your timer system to add an additional delay; a fraction of a second should be sufficient. Although presenting the modal view controller from within viewDidAppear worked for me in the iOS 5.1 simulator, Presenting a modal view controller when loading another ViewController says it sometimes doesn't happen.

Solution 2

As @Dondragmer said, if you want to present your viewController in root view's viewDidLoad, it will fail.Once your viewController is ready for that, you can present your new viewController. So, you can do that in

- (void)viewDidLayoutSubviews {
    //present here
}

Solution 3

I have it resolved. I was trying to present the view from view did load of the main view controller. Not sure why it does not work there, but instead I am now setting a timer which calls a method to present the view controller after the main view loads and it works fine now using...

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Thanks to those who replied.

Share:
61,390
user278859
Author by

user278859

Updated on September 05, 2020

Comments

  • user278859
    user278859 over 3 years

    I copied a working viewcontroller class from another project into a new project. I can't get the view to load in the new project. In the old project I used presentModalViewController. In the new I cannot get the view to load using either presentModalViewController or presentViewController

    I am trying to load the present the view from my main view controller.

    Here is what my main view controller interface looks like...

    //  ViewController.h
    #import <UIKit/UIKit.h>
    #import "RequestDialogViewController.h"
    
    @interface ViewController : UIViewController <RequestDialogViewControllerDelegate> {
    
    }
    
    - (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response;
    

    I am using presentModalViewController like this...

    RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];
    navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController];
    [self presentModalViewController:navigationController animated:YES];
    

    and presentViewController like this...

    RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];    
    [self presentViewController:requestIPViewController animated:YES completion:nil];
    

    What am I missing in the new project? The init method fires, but viewDidLoad does not and nothing is displayed.

    Thanks

  • user278859
    user278859 about 12 years
    Actually you are correct with regard to the presentModalViewController. I copied it wrong from my working code. I was, however, really wanting to get the presentViewController working as presentModalViewController has be deprecated. I did get it working... See my answer below.
  • Nate Symer
    Nate Symer over 11 years
    This method is only available in iOS 6 and beyond
  • Nate Symer
    Nate Symer over 11 years
    For future reference, don't do copy/paste programming.
  • rjgonzo
    rjgonzo over 11 years
    Wow, this was not obvious to me. I spent sometime trying to figure this out. Thanks.
  • Marplesoft
    Marplesoft about 11 years
    @NathanielSymer I don't think that's right. The docs say that presentViewController:animated:completion: is iOS5 and above. See developer.apple.com/library/ios/documentation/uikit/referenc‌​e/…:
  • Marplesoft
    Marplesoft about 11 years
    If this is happening upon app launch - isn't there still a flicker of the presenting view controller before the presented view controller is displayed? Any way around this? See stackoverflow.com/questions/14739461/… for context.
  • Ali Amin
    Ali Amin over 9 years
    It makes sense. because you have to dismiss a controller before presenting another one.
  • justColbs
    justColbs over 7 years
    This is still the case for iOS 10 Xcode 8 Swift 2.3. Thanks!
  • John Erck
    John Erck over 6 years
    ^ depends how many times you want to present it :) Da debugger's break point showed this getting called a couple of times in quick succession.