forked from steipete/PSAlertView
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPSPDFActionSheet.m
160 lines (127 loc) · 4.77 KB
/
PSPDFActionSheet.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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//
// PSPDFActionSheet.m
// PSPDFKit
//
// Copyright (c) 2012 Peter Steinberger. All rights reserved.
//
#import "PSPDFActionSheet.h"
#import <objc/runtime.h>
@interface PSPDFActionSheet() <UIActionSheetDelegate> {
id<UIActionSheetDelegate> _realDelegate;
NSMutableDictionary *_buttonTitleToBlockDict;
void (^_destroyBlock)();
}
@end
@implementation PSPDFActionSheet
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - NSObject
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
self.delegate = self;
// Create the blocks storage for handling all button actions
_buttonTitleToBlockDict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (id)initWithTitle:(NSString *)title {
if ((self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil])) {
// Does nothing
}
return self;
}
- (void)dealloc {
self.delegate = nil;
}
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - Public
- (void)setDelegate:(id<UIActionSheetDelegate>)delegate {
if(delegate == nil) {
[super setDelegate:nil];
_realDelegate = nil;
}else {
[super setDelegate:self];
if (delegate != self) {
_realDelegate = delegate;
}
}
}
- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block {
assert([title length] > 0 && "sheet destructive button title must not be empty");
[self addButtonWithTitle:title block:block];
self.destructiveButtonIndex = (self.numberOfButtons - 1);
}
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block {
assert([title length] > 0 && "sheet cancel button title must not be empty");
[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];
}
- (NSUInteger)buttonCount {
return self.numberOfButtons;
}
- (void)destroy {
[_buttonTitleToBlockDict removeAllObjects];
}
- (void)setDestroyBlock:(void (^)())block {
_destroyBlock = [block copy];
}
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - UIActionSheet
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
[super dismissWithClickedButtonIndex:buttonIndex animated:animated];
[self destroy];
}
///////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - UIActionSheetDelegate
// Called when a button is clicked. The view will be automatically dismissed after this call returns
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
// Run the button's block
NSString* title = [self buttonTitleAtIndex:buttonIndex];
id block = _buttonTitleToBlockDict[title];
if (block) ((void (^)())block)();
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex];
}
}
// Called when we cancel a view (eg. the user clicks the Home button). This is not called when the user clicks the cancel button.
// If not defined in the delegate, we simulate a click in the cancel button
- (void)actionSheetCancel:(UIActionSheet *)actionSheet {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate actionSheetCancel:actionSheet];
}
}
// before animation and showing view
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate willPresentActionSheet:actionSheet];
}
}
// after animation
- (void)didPresentActionSheet:(UIActionSheet *)actionSheet {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate didPresentActionSheet:actionSheet];
}
}
// before animation and hiding view
- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate actionSheet:actionSheet willDismissWithButtonIndex:buttonIndex];
}
}
// after animation
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if ([_realDelegate respondsToSelector:_cmd]) {
[_realDelegate actionSheet:actionSheet didDismissWithButtonIndex:buttonIndex];
}
[self destroy];
if (_destroyBlock) {
_destroyBlock();
}
self.delegate = nil;
}
@end