forked from AliSoftware/OHAlertView-OHActionSheet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UIAlertViewEx.m
97 lines (83 loc) · 2.96 KB
/
UIAlertViewEx.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//
// UIAlertViewEx.m
// FoodReporter
//
// Created by Olivier on 30/12/10.
// Copyright 2010 FoodReporter. All rights reserved.
//
#import "UIAlertViewEx.h"
@implementation UIAlertViewEx
@synthesize userInfo = _userInfo;
#if NS_BLOCKS_AVAILABLE
+(void)showAlertWithTitle:(NSString *)title message:(NSString *)message
cancelButton:(NSString *)cancelButtonTitle
otherButtons:(NSArray *)otherButtonTitles
onButtonTapped:(void(^)(UIAlertViewEx* alert, NSInteger buttonIndex))completion
{
UIAlertViewEx* alert = [[self alloc] initWithTitle:title message:message
cancelButton:cancelButtonTitle
otherButtons:otherButtonTitles
onButtonTapped:completion];
[alert show];
[alert autorelease];
}
+(void)showAlertWithTitle:(NSString *)title message:(NSString *)message
cancelButton:(NSString *)cancelButtonTitle
okButton:(NSString *)okButton // same as using a 1-item array for otherButtons
onButtonTapped:(void(^)(UIAlertViewEx* alert, NSInteger buttonIndex))completion
{
[self showAlertWithTitle:title message:message
cancelButton:cancelButtonTitle
otherButtons:[NSArray arrayWithObject:okButton]
onButtonTapped:completion];
}
-(id)initWithTitle:(NSString *)title message:(NSString *)message
cancelButton:(NSString *)cancelButtonTitle
otherButtons:(NSArray *)otherButtonTitles
onButtonTapped:(void(^)(UIAlertViewEx* alert, NSInteger buttonIndex))completion
{
// Note: need to send at least the first button because if the otherButtonTitles parameter is nil, self.firstOtherButtonIndex will be -1
NSString* firstOther = (otherButtonTitles && ([otherButtonTitles count]>0)) ? [otherButtonTitles objectAtIndex:0] : nil;
self = [super initWithTitle:title message:message
delegate:self
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:firstOther,nil];
if (self) {
for(NSInteger idx = 1; idx<[otherButtonTitles count];++idx) {
[self addButtonWithTitle: [otherButtonTitles objectAtIndex:idx] ];
}
_completionBlock = [completion copy];
}
return self;
}
#endif
-(void)setDelegate:(id)aDelegate didDismissSelector:(SEL)aSelector {
_finalDelegate = aDelegate;
_finalSelector = aSelector;
self.delegate = self;
}
-(void)dealloc {
[_completionBlock release];
[_userInfo release];
[super dealloc];
}
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
#if NS_BLOCKS_AVAILABLE
if (_completionBlock) {
_completionBlock(self,buttonIndex);
return;
}
#endif
// If you dont use blocks but delegate+customSelector
if (!_finalDelegate || !_finalSelector) return;
NSMethodSignature* ms = [[_finalDelegate class] instanceMethodSignatureForSelector:_finalSelector];
NSAssert(ms,@"Invalid selector for UIAlertViewEx!");
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:ms];
[inv setTarget:_finalDelegate];
[inv setSelector:_finalSelector];
[inv setArgument:&alertView atIndex:2];
[inv setArgument:&buttonIndex atIndex:3];
[inv invoke];
}
@end