Home

Awesome

RMUniversalAlert

Wrapper class for UIAlertView / UIActionSheet / UIAlertController for targeting all iOS versions.

RMUniversalAlert is a wrapper class that builds upon UIAlertView+Blocks, UIActionSheet+Blocks, and UIAlertController+Blocks, and gives a simplified interface to support all iOS versions.

Interface

typedef void(^RMUniversalAlertCompletionBlock)(RMUniversalAlert *alert, NSInteger buttonIndex);

Alert Views

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

Action Sheets

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

Usage - Alert Views

The below code will show an alert on all iOS versions, and allow you to perform your logic in a single inline code path. On iOS 8 and above, it will use UIAlertController - giving you red text on the destructive button. On iOS 7 and earlier, it will use a standard UIAlertView.

Objective-C

[RMUniversalAlert showAlertInViewController:self
                                  withTitle:@"Test Alert"
                                    message:@"Test Message"
                          cancelButtonTitle:@"Cancel"
                     destructiveButtonTitle:@"Delete"
                          otherButtonTitles:@[@"First Other", @"Second Other"]
                                   tapBlock:^(RMUniversalAlert *alert, NSInteger buttonIndex){
                                       if (buttonIndex == alert.cancelButtonIndex) {
                                           NSLog(@"Cancel Tapped");
                                       } else if (buttonIndex == alert.destructiveButtonIndex) {
                                           NSLog(@"Delete Tapped");
                                       } else if (buttonIndex >= alert.firstOtherButtonIndex) {
                                           NSLog(@"Other Button Index %ld", (long)buttonIndex - alert.firstOtherButtonIndex);
                                       }
                                   }];

Swift

RMUniversalAlert.showAlertInViewController(self,
    withTitle: "Test Alert",
    message: "Test Message",
    cancelButtonTitle: "Cancel",
    destructiveButtonTitle: "Delete",
    otherButtonTitles: ["First Other", "Second Other"],
    tapBlock: {(alert, buttonIndex) in
        if (buttonIndex == alert.cancelButtonIndex) {
            println("Cancel Tapped")
        } else if (buttonIndex == alert.destructiveButtonIndex) {
            println("Delete Tapped")
        } else if (buttonIndex >= alert.firstOtherButtonIndex) {
            println("Other Button Index \(buttonIndex - alert.firstOtherButtonIndex)")
        }
    })

Requirements

iOS 6 and later. Since version 0.7 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 - Action Sheet

The below code will show an action sheet on all iOS versions, and allow you to perform your logic in a single inline code path. On iOS 8 and above, it will use UIAlertController - giving you red text on the destructive button. On iOS 7 and earlier, it will use a standard UIActionSheet.

The popoverPresentationControllerBlock allows you to configure the popover's source view/rect/bar button item if the action sheet will be on an iPad.

Objective-C

[RMUniversalAlert showActionSheetInViewController:self
                                        withTitle:@"Test Action Sheet"
                                          message:@"Test Message"
                                cancelButtonTitle:@"Cancel"
                           destructiveButtonTitle:@"Delete"
                                otherButtonTitles:@[@"First Other", @"Second Other"]
               popoverPresentationControllerBlock:^(RMPopoverPresentationController *popover){
                                             popover.sourceView = self.view;
                                             popover.sourceRect = sender.frame;
                                         }
                                         tapBlock:^(RMUniversalAlert *alert, NSInteger buttonIndex){
                                             if (buttonIndex == alert.cancelButtonIndex) {
                                                 NSLog(@"Cancel Tapped");
                                             } else if (buttonIndex == alert.destructiveButtonIndex) {
                                                 NSLog(@"Delete Tapped");
                                             } else if (buttonIndex >= alert.firstOtherButtonIndex) {
                                                 NSLog(@"Other Button Index %ld", (long)buttonIndex - alert.firstOtherButtonIndex);
                                             }
                                         }];

Swift

RMUniversalAlert.showActionSheetInViewController(self,
    withTitle: "Test Action Sheet",
    message: "Test Message",
    cancelButtonTitle: "Cancel",
    destructiveButtonTitle: "Delete",
    otherButtonTitles: ["First Other", "Second Other"],
    popoverPresentationControllerBlock: {(popover) in
        popover.sourceView = self.view
        popover.sourceRect = sender.frame
    },
    tapBlock: {(alert, buttonIndex) in
        if (buttonIndex == alert.cancelButtonIndex) {
            println("Cancel Tapped")
        } else if (buttonIndex == alert.destructiveButtonIndex) {
            println("Delete Tapped")
        } else if (buttonIndex >= alert.firstOtherButtonIndex) {
            println("Other Button Index \(buttonIndex - alert.firstOtherButtonIndex)")
        }
    })

Installation

pod 'RMUniversalAlert' using CocoaPods.

Examples

Download this project, navigate to Tests and run pod install. Open RMUniversalAlert.xcworkspace.