Skip to content

Commit aa2d944

Browse files
committed
Merge branch 'feature/transition-out' into develop
Conflicts: SIAlertViewExample/SIAlertViewExample/ViewController.m
2 parents 2c6a305 + d18d23e commit aa2d944

3 files changed

Lines changed: 128 additions & 51 deletions

File tree

SIAlertView/SIAlertView.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ typedef void(^SIAlertViewHandler)(SIAlertView *alertView);
5050
- (void)addButtonWithTitle:(NSString *)title type:(SIAlertViewButtonType)type handler:(SIAlertViewHandler)handler;
5151

5252
- (void)show;
53-
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated;
53+
- (void)dismissAnimated:(BOOL)animated;
5454

5555
@end

SIAlertView/SIAlertView.m

Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ - (void)viewController:(SIAlertViewController *)viewController clickedButtonInde
3232
static NSMutableArray *__si_alert_queue;
3333
static BOOL __si_alert_animating;
3434
static SIBackgroundWindow *__si_alert_background_window;
35+
static SIAlertView *__si_alert_current_view;
3536

3637
@interface SIAlertView () <SIAlertViewControllerDelegate>
3738

@@ -44,6 +45,7 @@ @interface SIAlertView () <SIAlertViewControllerDelegate>
4445

4546
+ (SIBackgroundWindow *)sharedBackground;
4647
+ (NSMutableArray *)sharedQueue;
48+
+ (SIAlertView *)currentAlertView;
4749
+ (BOOL)isAnimating;
4850
+ (void)setAnimating:(BOOL)animating;
4951
+ (void)removeSharedBackground;
@@ -609,8 +611,9 @@ - (void)buttonAction:(UIButton *)button
609611
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
610612
{
611613
if (self.transitionCompletion) {
612-
self.transitionCompletion();
614+
void(^completion)(void) = [self.transitionCompletion copy]; // copy block to prevent override
613615
self.transitionCompletion = nil;
616+
completion();
614617
}
615618
}
616619

@@ -655,6 +658,16 @@ + (NSMutableArray *)sharedQueue
655658
return __si_alert_queue;
656659
}
657660

661+
+ (SIAlertView *)currentAlertView
662+
{
663+
return __si_alert_current_view;
664+
}
665+
666+
+ (void)setCurrentAlertView:(SIAlertView *)alertView
667+
{
668+
__si_alert_current_view = alertView;
669+
}
670+
658671
+ (BOOL)isAnimating
659672
{
660673
return __si_alert_animating;
@@ -706,6 +719,16 @@ - (void)show
706719
return; // wait for next turn
707720
}
708721

722+
if (self.isVisible) {
723+
return;
724+
}
725+
726+
if ([SIAlertView currentAlertView].isVisible) {
727+
SIAlertView *alert = [SIAlertView currentAlertView];
728+
[alert dismissAnimated:YES cleanup:NO];
729+
return;
730+
}
731+
709732
if (self.willShowHandler) {
710733
self.willShowHandler(self);
711734
}
@@ -732,6 +755,7 @@ - (void)show
732755
self.visible = YES;
733756

734757
[SIAlertView setAnimating:YES];
758+
[SIAlertView setCurrentAlertView:self];
735759

736760
[self.viewController transitionInCompletion:^{
737761
if (self.didShowHandler) {
@@ -740,21 +764,40 @@ - (void)show
740764

741765
[SIAlertView setAnimating:NO];
742766

743-
[self showNextIfNeededForAlert:self];
767+
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
768+
if (index < [SIAlertView sharedQueue].count - 1) {
769+
[self dismissAnimated:YES cleanup:NO]; // dismiss to show next alert view
770+
}
744771
}];
772+
}
773+
774+
+ (void)cleanUpForAlertView:(SIAlertView *)alertView
775+
{
776+
alertView.visible = NO;
777+
778+
[alertView.alertWindow removeFromSuperview];
779+
alertView.alertWindow = nil;
780+
alertView.viewController = nil;
781+
782+
[[SIAlertView sharedQueue] removeObject:alertView];
783+
784+
[SIAlertView setAnimating:NO];
745785

746-
// hide previous alert
747-
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
748-
if (index > 0) {
749-
SIAlertView *alert = [SIAlertView sharedQueue][index - 1];
750-
alert.alertWindow.hidden = YES;
751-
alert.visible = NO;
786+
if (alertView.didDismissHandler) {
787+
alertView.didDismissHandler(alertView);
752788
}
753789
}
754790

755-
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
791+
- (void)dismissAnimated:(BOOL)animated
756792
{
757-
if (self.willDismissHandler) {
793+
[self dismissAnimated:animated cleanup:YES];
794+
}
795+
796+
- (void)dismissAnimated:(BOOL)animated cleanup:(BOOL)cleanup
797+
{
798+
BOOL isVisible = self.isVisible;
799+
800+
if (isVisible && self.willDismissHandler) {
758801
self.willDismissHandler(self);
759802
}
760803

@@ -765,37 +808,36 @@ - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)anim
765808
self.alertWindow = nil;
766809
self.viewController = nil;
767810

768-
[[SIAlertView sharedQueue] removeObject:self];
811+
[SIAlertView setCurrentAlertView:nil];
812+
813+
SIAlertView *nextAlertView;
814+
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
815+
if (index != NSNotFound && index < [SIAlertView sharedQueue].count - 1) {
816+
nextAlertView = [SIAlertView sharedQueue][index + 1];
817+
}
818+
819+
if (cleanup) {
820+
[[SIAlertView sharedQueue] removeObject:self];
821+
}
769822

770823
[SIAlertView setAnimating:NO];
771824

772-
if (self.didDismissHandler) {
825+
if (isVisible && self.didDismissHandler) {
773826
self.didDismissHandler(self);
774827
}
775828

776-
if ([SIAlertView sharedQueue].count > 0) {
777-
778-
SIAlertView *alert = [[SIAlertView sharedQueue] lastObject];
779-
780-
if (alert.viewController) {
781-
// show previous alert
782-
alert.alertWindow.hidden = NO;
783-
alert.visible = YES;
784-
785-
// transition in again
786-
[alert.viewController transitionInCompletion:^{
787-
[SIAlertView setAnimating:NO];
788-
789-
[self showNextIfNeededForAlert:alert];
790-
}];
791-
} else {
792-
// show new added alert
829+
if (nextAlertView) {
830+
[nextAlertView show];
831+
} else {
832+
// show last alert view
833+
if ([SIAlertView sharedQueue].count > 0) {
834+
SIAlertView *alert = [[SIAlertView sharedQueue] lastObject];
793835
[alert show];
794836
}
795837
}
796838
};
797839

798-
if (animated) {
840+
if (animated && isVisible) {
799841
[SIAlertView setAnimating:YES];
800842
[self.viewController transitionOutCompletion:dismissComplete];
801843

@@ -806,33 +848,22 @@ - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)anim
806848
} else {
807849
dismissComplete();
808850

809-
if ([SIAlertView sharedQueue].count == 1) {
851+
if ([SIAlertView sharedQueue].count == 0) {
810852
[[SIAlertView sharedBackground] hideAnimated:NO];
811853
}
812854
}
813855
}
814856

815-
#pragma mark - Private
816-
817-
- (void)showNextIfNeededForAlert:(SIAlertView *)alert
818-
{
819-
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:alert];
820-
if (index < [SIAlertView sharedQueue].count - 1) {
821-
SIAlertView *alert = [SIAlertView sharedQueue][index + 1];
822-
[alert show];
823-
}
824-
}
825-
826857
#pragma mark - SIAlertViewControllerDelegate
827858

828859
- (void)viewController:(SIAlertViewController *)viewController clickedButtonIndex:(NSInteger)buttonIndex
829860
{
830-
[SIAlertView setAnimating:YES];
861+
[SIAlertView setAnimating:YES]; // set this flag to YES in order to prevent showing another alert in action block
831862
SIAlertItem *item = self.items[buttonIndex];
832863
if (item.action) {
833864
item.action(self);
834865
}
835-
[self dismissWithClickedButtonIndex:buttonIndex animated:YES];
866+
[self dismissAnimated:YES];
836867
}
837868

838869
#pragma mark - UIAppearance getters

SIAlertViewExample/SIAlertViewExample/ViewController.m

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ - (void)viewDidLoad
2626

2727
- (IBAction)alert1:(id)sender
2828
{
29-
SIAlertView *alertView = [[SIAlertView alloc] initWithTitle:@"Title1" andMessage:@"Message1"];
29+
SIAlertView *alertView = [[SIAlertView alloc] initWithTitle:@"Title1" andMessage:@"Count down"];
3030
[alertView addButtonWithTitle:@"Button1"
3131
type:SIAlertViewButtonTypeDefault
3232
handler:^(SIAlertView *alertView) {
@@ -44,21 +44,39 @@ - (IBAction)alert1:(id)sender
4444
}];
4545

4646
alertView.willShowHandler = ^(SIAlertView *alertView) {
47-
NSLog(@"%@, willShowHandler", self);
47+
NSLog(@"%@, willShowHandler", alertView);
4848
};
4949
alertView.didShowHandler = ^(SIAlertView *alertView) {
50-
NSLog(@"%@, didShowHandler", self);
50+
NSLog(@"%@, didShowHandler", alertView);
5151
};
5252
alertView.willDismissHandler = ^(SIAlertView *alertView) {
53-
NSLog(@"%@, willDismissHandler", self);
53+
NSLog(@"%@, willDismissHandler", alertView);
5454
};
5555
alertView.didDismissHandler = ^(SIAlertView *alertView) {
56-
NSLog(@"%@, didDismissHandler", self);
56+
NSLog(@"%@, didDismissHandler", alertView);
5757
};
5858

5959
[alertView show];
6060

61-
alertView.title = @"New Title";
61+
alertView.title = @"3";
62+
double delayInSeconds = 1.0;
63+
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
64+
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
65+
alertView.title = @"2";
66+
});
67+
delayInSeconds = 2.0;
68+
popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
69+
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
70+
alertView.title = @"1";
71+
});
72+
delayInSeconds = 3.0;
73+
popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
74+
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
75+
NSLog(@"1=====");
76+
[alertView dismissAnimated:YES];
77+
NSLog(@"2=====");
78+
});
79+
6280
}
6381

6482
- (IBAction)alert2:(id)sender
@@ -81,6 +99,20 @@ - (IBAction)alert2:(id)sender
8199
alertView.cornerRadius = 10;
82100
alertView.buttonFont = [UIFont boldSystemFontOfSize:15];
83101
alertView.transitionStyle = SIAlertViewTransitionStyleBounce;
102+
103+
alertView.willShowHandler = ^(SIAlertView *alertView) {
104+
NSLog(@"%@, willShowHandler2", alertView);
105+
};
106+
alertView.didShowHandler = ^(SIAlertView *alertView) {
107+
NSLog(@"%@, didShowHandler2", alertView);
108+
};
109+
alertView.willDismissHandler = ^(SIAlertView *alertView) {
110+
NSLog(@"%@, willDismissHandler2", alertView);
111+
};
112+
alertView.didDismissHandler = ^(SIAlertView *alertView) {
113+
NSLog(@"%@, didDismissHandler2", alertView);
114+
};
115+
84116
[alertView show];
85117
}
86118

@@ -98,6 +130,20 @@ - (IBAction)alert3:(id)sender
98130
NSLog(@"OK Clicked");
99131
}];
100132
alertView.transitionStyle = SIAlertViewTransitionStyleDropDown;
133+
134+
alertView.willShowHandler = ^(SIAlertView *alertView) {
135+
NSLog(@"%@, willShowHandler3", alertView);
136+
};
137+
alertView.didShowHandler = ^(SIAlertView *alertView) {
138+
NSLog(@"%@, didShowHandler3", alertView);
139+
};
140+
alertView.willDismissHandler = ^(SIAlertView *alertView) {
141+
NSLog(@"%@, willDismissHandler3", alertView);
142+
};
143+
alertView.didDismissHandler = ^(SIAlertView *alertView) {
144+
NSLog(@"%@, didDismissHandler3", alertView);
145+
};
146+
101147
[alertView show];
102148
}
103149

0 commit comments

Comments
 (0)