Jordan
Jordan

Reputation: 2140

Two UIAlertView consecutively in didFinishLaunchingWithOptions

I want two alert views to show up only when the user opens my application for the first time -- the second to appear after the first is dismissed. I have it set up to only show the UIAlertViews when it has not been shown before and I do not need help with this. I need help figuring out how to display two alert views in a row when this is the case.

-(void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex does not work for me.

Here is the code I have -- remember this is in didFinishLaunchingWithOptions:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL didFirstLaunch = [defaults boolForKey:@"DidFirstLaunch"];
if (!didFirstLaunch) {
    [defaults setBool:YES forKey:@"DidFirstLaunch"];

    UIAlertView *successAlert = //not important
    [successAlert show];
    [successAlert release];

    //Somehow show second alert after the first is dismissed
}

Upvotes: 1

Views: 1382

Answers (3)

Wolfgang Schreurs
Wolfgang Schreurs

Reputation: 11834

I'm gonna post a very simple solution using GCD & blocks (GCD part is just in case the alert view is created on another thread then the main thread, callback should be safe to perform on the main thread). Remember, I just coded this in like 5 mins, so you definitely should work on improving the code. One thing that's a bit ugly is the delegate parameter that is overridden in my subclass. The interface of the subclass could be changed a bit to make it more obvious of what happens ...

Anyway, here goes ...

First create a subclass of UIAlertView, make it look somewhat like the following ...

@interface FSAlertView () <UIAlertViewDelegate>

@property (nonatomic, copy) void (^dismissHandler)(NSInteger buttonIndex);

@end


@implementation FSAlertView

@synthesize dismissHandler = _dismissHandler;

- (void)showWithDismissHandler:(void (^)(NSInteger buttonIndex))dismissHandler
{
    self.dismissHandler = dismissHandler;

    self.delegate = self;

    [self show];
}

// Alert view delegate

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^ {

        if (_dismissHandler)
        {
            _dismissHandler(buttonIndex);
        }

    });
}

Now in the app we can create alert views like the following ...

FSAlertView *alert1 = [[FSAlertView alloc] initWithTitle:@"Alert 1"
                                                 message:@"Some message"
                                                delegate:nil
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"Show 2nd Alert", nil];

[alert1 showWithDismissHandler:^ (NSInteger buttonIndex) {

    NSLog(@"button pressed: %d", buttonIndex);

    if (buttonIndex == 1)
    {
        UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Alert 2"
                                                         message:@"Hi!"
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
        [alert2 show];
    }

}];

Upvotes: 4

Nibin V
Nibin V

Reputation: 582

Try this:

UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;

AlertView Delegate Method:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    switch (alertView.tag) {
        case 444:
        {
            //Cancel ButtonIndex = 0
            if (buttonIndex == 1) {
                UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
                [secondAlert setTag:555];
                [secondAlert show];
                secondAlert = nil;
            } 
        }
        break;
        case 555:
        {
            if (buttonIndex == 1) {
                NSLog(@"Code Here");
            }
        }
        break;
    }
}

Upvotes: 0

Nayan Chauhan
Nayan Chauhan

Reputation: 542

If i understand your question correctly , then this may help:

 UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Alert 1" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
    [firstAlert show];
    [self performSelector:@selector(test:) withObject:firstAlert afterDelay:2];
    [firstAlert release];

    UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Alert 2" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
    [secondAlert show];
    [self performSelector:@selector(test:) withObject:secondAlert afterDelay:2];
    [secondAlert release];


-(void)test:(UIAlertView*)alert{
    [alert dismissWithClickedButtonIndex:-1 animated:YES];
}

This will show two alert views one after the other.

NOTE: I am not sure if you are dismissing the alerts with cancel button so i am dismissing them automatically after few seconds.

Upvotes: 1

Related Questions