Skip to content

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:selfwithTitle:@"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");
} elseif (buttonIndex == controller.destructiveButtonIndex) {
NSLog(@"Delete Tapped");
} elseif (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)inif(buttonIndex == controller.cancelButtonIndex){print("Cancel Tapped")}elseif(buttonIndex == controller.destructiveButtonIndex){print("Delete Tapped")}elseif(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:selfwithTitle:NSLocalizedString(@"AlertTitleDeleteSalesOrder", nil)
message:NSLocalizedString(@"AlertMessageDeleteSalesOrder", nil)
cancelButtonTitle:NSLocalizedString(@"AlertButtonTitleCancel", nil)
destructiveButtonTitle:NSLocalizedString(@"AlertButtonTitleDelete", nil)
otherButtonTitles:niltapBlock:^(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.

About

Convenience methods for UIAlertController

Resources

Stars

247 stars

Watchers

9 watching

Forks

Releases

Packages

Contributors

Languages