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.