UIAlertView button action not working

I have one alert view and when I click Yes it should create another alert view and toast message, but it doesn't. I could not understand. Here is my code:

-(void)myMethod {
    UIAlertView *saveAlert = [[UIAlertView alloc] initWithTitle:@"First Message"
                                                        message:@"My First message"
                                                       delegate:nil
                                              cancelButtonTitle:@"No"
                                              otherButtonTitles:@"Yes", nil];
    saveAlert.tag=0;
    [saveAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];
}

      

This is the method I use to provide functionality for different kinds of alerts.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(alertView.tag==0) {

        if (buttonIndex == 0)
        {
            //Code for Cancel button
        }
        if (buttonIndex == 1)
        {
            //code for yes button
            MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
            hud.mode = MBProgressHUDModeText;
            hud.labelText = @"Successfully displayed First Message";
            hud.margin = 10.f;
            hud.yOffset = 150.f;
            hud.removeFromSuperViewOnHide = YES;
            [hud hide:YES afterDelay:3];

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Second Message"
                                                            message:@"My second message"
                                                           delegate:nil
                                                  cancelButtonTitle:@"No"
                                                  otherButtonTitles:@"Yes",nil];
            alert.tag=1;
            [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
        }
    }

    if (alertView.tag==1) {

        if (buttonIndex == 0)
        {
            //Code for Cancel button
        }
        if (buttonIndex == 1)
        {
            //Code for yes Button
            MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
            hud.mode = MBProgressHUDModeText;
            hud.labelText = @"Succesfully displayed Second Message";
            hud.margin = 10.f;
            hud.yOffset = 150.f;
            hud.removeFromSuperViewOnHide = YES;
            [hud hide:YES afterDelay:3];
        }
    }
}

      

Can anyone help finding the problem. Why can't I get the second warning after clicking Yes on the first warning?

+3


source to share


3 answers


You haven't set a delegate for UIAlertView

yours, and also make sure your delegate is protocol compliant UIAlertViewDelegate

. Find below code snippet.

The controller complies with the protocol UIAlertViewDelegate

:

@interface YourViewController : UIViewController <UIAlertViewDelegate> 

      

Build UIAlertView

and install deleagte:



UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"First Message"
                                                    message:@"Show second message"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
[alertView show];

      

Implement UIAlertViewDelegate

delegate method :

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if( 0 == buttonIndex ){ //cancel button
        [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
   } else if ( 1 == buttonIndex ){
        [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
        UIAlertView * secondAlertView = [[UIAlertView alloc] initWithTitle:@"Second Message"
                                                                   message:@"Displaying second message"
                                                                  delegate:nil
                                                         cancelButtonTitle:@"OK"
                                                         otherButtonTitles:nil];
        [secondAlertView show];
    }
}

      

+2


source


You are specifying null as a delegate for your alerts. You need to specify an object so the alertView: clickedButtonAtIndex :!



+2


source


If you want to handle this more clearly, you can use a block based AlertView. Create a new file-> Subclass of-> UIAlertView

SuperAlertView.h

#import <UIKit/UIKit.h>

@class MySuperAlertView;

typedef void (^MySuperAlertViewBlock) (MySuperAlertView *alertView);

@interface MySuperAlertView : UIAlertView

- (instancetype) initWithTitle:(NSString *)title message:(NSString *)message;
- (void) addButtonWithTitle:(NSString *)buttonTitle block:(MySuperAlertViewBlock) block;

@end

      

SuperAlertView.m

#import "MySuperAlertView.h"

@interface MySuperAlertView()<UIAlertViewDelegate>
@property NSMutableArray *blocks;
@end

@implementation MySuperAlertView


- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message
{
    if (self = [super initWithTitle:title message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil])
    {
        self.blocks = [NSMutableArray array];
    }
    return self;
}

- (void)addButtonWithTitle:(NSString *)buttonTitle block:(MySuperAlertViewBlock)block
{
    [self addButtonWithTitle:buttonTitle];

    [self.blocks addObject:block ? [block copy] : [NSNull null]];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    MySuperAlertViewBlock block = self.blocks[buttonIndex];

    if ((id) block != [NSNull null]){
        block(self);
    }
}


@end

      

Using:

MySuperAlertView *alertView = [[MySuperAlertView alloc] initWithTitle:@"Info" message:NSLocalizedString(@"EMAIL_SENT_SUCCESSFULL", nil)];
            [alertView addButtonWithTitle:@"Ok" block:^(MySupertAlertView *alertView) {
                // handle result from ok button here
            }];
            [alertView addButtonWithTitle:@"cancel" block:NULL];
            dispatch_async(dispatch_get_main_queue(), ^{
                [alertView show];
            });

      

0


source







All Articles