头文件
//
// UIAlertView+Utils.h
// UIView+Categories
//
// Created by su xinde on 13-4-11.
// Copyright (c) 2013年 su xinde. All rights reserved.
//
#import <UIKit/UIKit.h>
/*
* Completion handler invoked when user taps a button.
*
* @param alertView The alert view being shown.
* @param buttonIndex The index of the button tapped.
*/
typedef void(^UIAlertViewHandler)(UIAlertView *alertView, NSInteger buttonIndex);
/**
* Category of `UIAlertView` that offers a completion handler to listen to interaction. This avoids the need of the implementation of the delegate pattern.
*
* @warning Completion handler: Invoked when user taps a button.
*
* typedef void(^UIAlertViewHandler)(UIAlertView *alertView, NSInteger buttonIndex);
*
* - *alertView* The alert view being shown.
* - *buttonIndex* The index of the button tapped.
*/
@interface UIAlertView (Utils)
/**
* Shows the receiver alert with the given handler.
*
* @param handler The handler that will be invoked in user interaction.
*/
- (void)showWithHandler:(UIAlertViewHandler)handler;
/**
* Utility selector to show an alert with a title, a message and a button to dimiss.
*
* @param title The title of the alert.
* @param message The message to show in the alert.
* @param handler The handler that will be invoked in user interaction.
*/
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
handler:(UIAlertViewHandler)handler;
/**
* Utility selector to show an alert with an "Error" title, a message and a button to dimiss.
*
* @param message The message to show in the alert.
* @param handler The handler that will be invoked in user interaction.
*/
+ (void)showErrorWithMessage:(NSString *)message
handler:(UIAlertViewHandler)handler;
/**
* Utility selector to show an alert with a "Warning" title, a message and a button to dimiss.
*
* @param message The message to show in the alert.
* @param handler The handler that will be invoked in user interaction.
*/
+ (void)showWarningWithMessage:(NSString *)message
handler:(UIAlertViewHandler)handler;
/**
* Utility selector to show a confirmation dialog with a title, a message and two buttons to accept or cancel.
*
* @param title The title of the alert.
* @param message The message to show in the alert.
* @param handler The handler that will be invoked in user interaction.
*/
+ (void)showConfirmationDialogWithTitle:(NSString *)title
message:(NSString *)message
handler:(UIAlertViewHandler)handler;
@end
实现文件
//
// UIAlertView+Utils.m
// UIView+Categories
//
// Created by su xinde on 13-4-11.
// Copyright (c) 2013年 su xinde. All rights reserved.
//
#import "UIAlertView+Utils.h"
#import <objc/runtime.h>
/*
* Runtime association key.
*/
static NSString *kHandlerAssociatedKey = @"kHandlerAssociatedKey";
@implementation UIAlertView (Utils)
#pragma mark - Showing
/*
* Shows the receiver alert with the given handler.
*/
- (void)showWithHandler:(UIAlertViewHandler)handler {
objc_setAssociatedObject(self, (const void *)(kHandlerAssociatedKey), handler, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self setDelegate:self];
[self show];
}
#pragma mark - UIAlertViewDelegate
/*
* Sent to the delegate when the user clicks a button on an alert view.
*/
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
UIAlertViewHandler completionHandler = objc_getAssociatedObject(self, (const void *)(kHandlerAssociatedKey));
if (completionHandler != nil) {
completionHandler(alertView, buttonIndex);
}
}
#pragma mark - Utility methods
/*
* Utility selector to show an alert with a title, a message and a button to dimiss.
*/
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
handler:(UIAlertViewHandler)handler {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert showWithHandler:handler];
}
/*
* Utility selector to show an alert with an "Error" title, a message and a button to dimiss.
*/
+ (void)showErrorWithMessage:(NSString *)message
handler:(UIAlertViewHandler)handler {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert showWithHandler:handler];
}
/*
* Utility selector to show an alert with a "Warning" title, a message and a button to dimiss.
*/
+ (void)showWarningWithMessage:(NSString *)message
handler:(UIAlertViewHandler)handler {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert showWithHandler:handler];
}
/*
* Utility selector to show a confirmation dialog with a title, a message and two buttons to accept or cancel.
*/
+ (void)showConfirmationDialogWithTitle:(NSString *)title
message:(NSString *)message
handler:(UIAlertViewHandler)handler {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil];
[alert showWithHandler:handler];
}
@end