forked from steipete/PSAlertView
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PSPDFAlertView.m
141 lines (111 loc) · 3.99 KB
/
PSPDFAlertView.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
// PSPDFAlertView.m
//
// Copyright 2011-2012 Peter Steinberger. All rights reserved.
//
//
#import "PSPDFAlertView.h"
#import <objc/runtime.h>
@interface PSPDFAlertView() <UIAlertViewDelegate> {
id<UIAlertViewDelegate> _realDelegate;
NSMutableDictionary *_buttonTitleToBlockDict;
}
@end
@implementation PSPDFAlertView
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - NSObject
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.delegate = self;
_buttonTitleToBlockDict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (id)initWithTitle:(NSString *)title {
return self = [self initWithTitle:title message:nil];
}
- (id)initWithTitle:(NSString *)title message:(NSString *)message {
if ((self = [super initWithTitle:title message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil])) {
}
return self;
}
- (void)dealloc {
self.delegate = nil;
}
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - Public
- (void)setDelegate:(id<UIAlertViewDelegate>)delegate {
if(delegate == nil) {
[super setDelegate:nil];
_realDelegate = nil;
}else {
[super setDelegate:self];
if (delegate != self) {
_realDelegate = delegate;
}
}
}
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block {
assert([title length] > 0 && "cannot set empty button title");
[self addButtonWithTitle:title block:block];
self.cancelButtonIndex = (self.numberOfButtons - 1);
}
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block {
assert([title length] > 0 && "cannot add button with empty title");
if (block) _buttonTitleToBlockDict[title] = [block copy];
[self addButtonWithTitle:title];
}
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
[super dismissWithClickedButtonIndex:buttonIndex animated:animated];
[self alertView:self clickedButtonAtIndex:buttonIndex];
}
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
// Run the button's block
NSString* buttonTitle = [self buttonTitleAtIndex:buttonIndex];
id block = _buttonTitleToBlockDict[buttonTitle];
if (block) {
((void (^)())block)();
// manually break potential retain cycle
[_buttonTitleToBlockDict removeObjectForKey:buttonTitle];
}
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate alertView:alertView clickedButtonAtIndex:buttonIndex];
}
}
- (void)alertViewCancel:(UIAlertView *)alertView {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate alertViewCancel:alertView];
}
}
- (void)willPresentAlertView:(UIAlertView *)alertView {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate willPresentAlertView:alertView];
}
}
- (void)didPresentAlertView:(UIAlertView *)alertView {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate didPresentAlertView:alertView];
}
}
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate alertView:alertView willDismissWithButtonIndex:buttonIndex];
}
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate alertView:alertView didDismissWithButtonIndex:buttonIndex];
}
}
- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView {
if ([_realDelegate respondsToSelector:_cmd]) {
return [_realDelegate alertViewShouldEnableFirstOtherButton:alertView];
}else {
return YES;
}
}
@end