Search code examples
iosxcodeios5xcode4storyboard

iOS 5 Storyboard with Sign In Overlay (iOS 5.1; Xcode 4.3.3)?


I'm trying to create an iOS (iPhone specific) app where users have to authenticate before accessing the rest of the app. I'm using a Storyboard for the main application which looks like this (broken up into separate lines):

(1)        -> NavigationController
(2)  -(o-o)-> OfficesViewController
(3)   -[<-]-> OfficeViewController

I also have a separate XIB file called ScanOverlayViewController which gets programmatically pushed by the OfficeViewController when a user presses on a button. Not sure if it's proper to have Storyboards and XIBs mixed in like this, but it's been working so far.

Anyway, back on topic, I want to put an authentication screen infront of the NavigaitonController, but I'm not sure how.

I've tried placing an unlinked view in the Storyboard and setting it as the initial view. I then placed a hidden button and made a segue to the NavigationController. In code I tried having the controller perform the segue but the seque wasn't actually being performed even though the view had appeared properly.

I then tried to make the authentication view it's own separate XIB and initializing the controller in the app delegate and setting its view as a sub view of the app delegate. That just resulted in the app going directly to the OfficesViewController view as if I hadn't done anything.

Is there a specific way of doing this properly so it works with Storyboards?

Thanks in advance!

UPDATE

Here's my current app delegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AuthenticationViewController *authenticationViewController = [[AuthenticationViewController alloc] initWithNibName:@"AuthenticationViewController" bundle:nil];

if (authenticationViewController) {
    NSLog(@"Should have generated %@", authenticationViewController);
};

[[[application keyWindow] rootViewController] presentModalViewController:authenticationViewController animated:YES];

    return YES;
}

The controller does get allocated and initialized, but it's just not showing up.


Solution

  • Have the NavigaitonController as your initial view controller, then present the authentication screen modally if required. You can do this in -application:didFinishLaunchingWithOptions:.

    Mixing XIB files and storyboards is fine, storyboards get turned into XIB (or nib) files anyway, they just have some extra meta data. Mix and match as makes sense.

    E.g.:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if ([self needsAuthentication])
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                AuthVC *authVC = [[AuthVC alloc] init];
                [[UIWindow keyWindow].rootViewController presentModalViewController:authVC animated:YES];
            });
        }
        // anything else
        return YES;
    }