Skip to content

ryanmaxwell/UIAlertController-Blocks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

15c3479 · May 22, 2017

History

60 Commits
Oct 20, 2016
Aug 10, 2016
Nov 16, 2014
Nov 16, 2014
May 17, 2017
Aug 10, 2016
Oct 20, 2016
Oct 20, 2016

Repository files navigation

UIAlertController+Blocks

Convenience methods for UIAlertController. The API follows the same pattern as UIAlertView+Blocks and UIActionSheet+Blocks

Create and show an alert controller with a single call:

Objective-C

[UIAlertController showAlertInViewController:self
                                   withTitle:@"Test Alert"
                                     message:@"Test Message"
                           cancelButtonTitle:@"Cancel"
                      destructiveButtonTitle:@"Delete"
                           otherButtonTitles:@[@"First Other", @"Second Other"]
                                    tapBlock:^(UIAlertController *controller, UIAlertAction *action, NSInteger buttonIndex){

                                         if (buttonIndex == controller.cancelButtonIndex) {
                                             NSLog(@"Cancel Tapped");
                                         } else if (buttonIndex == controller.destructiveButtonIndex) {
                                             NSLog(@"Delete Tapped");
                                         } else if (buttonIndex >= controller.firstOtherButtonIndex) {
                                             NSLog(@"Other Button Index %ld", (long)buttonIndex - controller.firstOtherButtonIndex);
                                         }
                                     }];

Swift

UIAlertController.showAlert(
    in: self,
    withTitle: "Test Alert",
    message: "Test Message",
    cancelButtonTitle: "Cancel",
    destructiveButtonTitle: "Delete",
    otherButtonTitles: ["First Other", "Second Other"],
    tap: {(controller, action, buttonIndex) in
        if (buttonIndex == controller.cancelButtonIndex) {
            print("Cancel Tapped")
         } else if (buttonIndex == controller.destructiveButtonIndex) {
            print("Delete Tapped")
         } else if (buttonIndex >= controller.firstOtherButtonIndex) {
            print("Other Button Index \(buttonIndex - controller.firstOtherButtonIndex)")
         }
    }
)

Explicitly create alerts or action sheets with

+ (instancetype)showAlertInViewController:(UIViewController *)viewController
                                withTitle:(NSString *)title
                                  message:(NSString *)message
                        cancelButtonTitle:(NSString *)cancelButtonTitle
                   destructiveButtonTitle:(NSString *)destructiveButtonTitle
                        otherButtonTitles:(NSArray *)otherButtonTitles
                                 tapBlock:(UIAlertControllerCompletionBlock)tapBlock;

and

+ (instancetype)showActionSheetInViewController:(UIViewController *)viewController
                                      withTitle:(NSString *)title
                                        message:(NSString *)message
                              cancelButtonTitle:(NSString *)cancelButtonTitle
                         destructiveButtonTitle:(NSString *)destructiveButtonTitle
                              otherButtonTitles:(NSArray *)otherButtonTitles
             popoverPresentationControllerBlock:(void(^)(UIPopoverPresentationController *popover))popoverPresentationControllerBlock
                                       tapBlock:(UIAlertControllerCompletionBlock)tapBlock;

Requirements

Since version 0.9 the headers use the new Objective-C nullability annotations for nicer interoperability with Swift, so you will need Xcode 6.3 or later to compile it.

Usage

Add UIAlertController+Blocks.h/m into your project, or pod 'UIAlertController+Blocks' using CocoaPods. In your code, either #import <UIAlertController+Blocks/UIAlertController+Blocks.h> (Objective-C header), @import UIAlertController_Blocks; (Objective-C module), or import UIAlertController_Blocks (Swift).

Supporting < iOS 8

You can add this pod to your project, along with 'UIAlertView+Blocks' or 'UIActionSheet+Blocks', and as long as you build with the iOS 8 SDK or greater, instantiate the appropriate class at runtime. e.g.

void(^deleteSalesOrderBlock)(void) = ^{
    /* Delete the sales order here */
};

if ([UIAlertController class]) {
    
    /* UIAlertController is preferable on >= iOS 8, as the destructive button will be in red */
    
    [UIAlertController showAlertInViewController:self
                                       withTitle:NSLocalizedString(@"AlertTitleDeleteSalesOrder", nil)
                                         message:NSLocalizedString(@"AlertMessageDeleteSalesOrder", nil)
                               cancelButtonTitle:NSLocalizedString(@"AlertButtonTitleCancel", nil)
                          destructiveButtonTitle:NSLocalizedString(@"AlertButtonTitleDelete", nil)
                               otherButtonTitles:nil
                                        tapBlock:^(UIAlertController *controller, UIAlertAction *action, NSInteger buttonIndex){
                                            if (buttonIndex == controller.destructiveButtonIndex) {
                                                deleteSalesOrderBlock();
                                            }
                                        }];
    
    
} else {
    [UIAlertView showWithTitle:NSLocalizedString(@"AlertTitleDeleteSalesOrder", nil)
                       message:NSLocalizedString(@"AlertMessageDeleteSalesOrder", nil)
             cancelButtonTitle:NSLocalizedString(@"AlertButtonTitleCancel", nil)
             otherButtonTitles:@[NSLocalizedString(@"AlertButtonTitleDelete", nil)]
                      tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex){
                          if (buttonIndex == alertView.firstOtherButtonIndex) {
                              deleteSalesOrderBlock();
                          }
                      }];
}

I have also created the wrapper class RMUniversalAlert which can do the above automatically for you.