Skip to content

Commit d18d23e

Browse files
committed
finish queue transition out
1 parent b63e804 commit d18d23e

3 files changed

Lines changed: 111 additions & 67 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: 70 additions & 62 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;
@@ -607,8 +609,9 @@ - (void)buttonAction:(UIButton *)button
607609
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
608610
{
609611
if (self.transitionCompletion) {
610-
self.transitionCompletion();
612+
void(^completion)(void) = [self.transitionCompletion copy]; // copy block to prevent override
611613
self.transitionCompletion = nil;
614+
completion();
612615
}
613616
}
614617

@@ -653,6 +656,16 @@ + (NSMutableArray *)sharedQueue
653656
return __si_alert_queue;
654657
}
655658

659+
+ (SIAlertView *)currentAlertView
660+
{
661+
return __si_alert_current_view;
662+
}
663+
664+
+ (void)setCurrentAlertView:(SIAlertView *)alertView
665+
{
666+
__si_alert_current_view = alertView;
667+
}
668+
656669
+ (BOOL)isAnimating
657670
{
658671
return __si_alert_animating;
@@ -704,14 +717,14 @@ - (void)show
704717
return; // wait for next turn
705718
}
706719

707-
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
708-
if (index > 0) {
709-
SIAlertView *alert = [SIAlertView sharedQueue][index - 1];
710-
711-
if (alert.isVisible) {
712-
713-
[SIAlertView cleanUpForAlertView:alert];
714-
}
720+
if (self.isVisible) {
721+
return;
722+
}
723+
724+
if ([SIAlertView currentAlertView].isVisible) {
725+
SIAlertView *alert = [SIAlertView currentAlertView];
726+
[alert dismissAnimated:YES cleanup:NO];
727+
return;
715728
}
716729

717730
if (self.willShowHandler) {
@@ -740,6 +753,7 @@ - (void)show
740753
self.visible = YES;
741754

742755
[SIAlertView setAnimating:YES];
756+
[SIAlertView setCurrentAlertView:self];
743757

744758
[self.viewController transitionInCompletion:^{
745759
if (self.didShowHandler) {
@@ -748,7 +762,10 @@ - (void)show
748762

749763
[SIAlertView setAnimating:NO];
750764

751-
[SIAlertView showNextIfNeededForAlert:self];
765+
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
766+
if (index < [SIAlertView sharedQueue].count - 1) {
767+
[self dismissAnimated:YES cleanup:NO]; // dismiss to show next alert view
768+
}
752769
}];
753770
}
754771

@@ -769,54 +786,56 @@ + (void)cleanUpForAlertView:(SIAlertView *)alertView
769786
}
770787
}
771788

772-
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
789+
- (void)dismissAnimated:(BOOL)animated
790+
{
791+
[self dismissAnimated:animated cleanup:YES];
792+
}
793+
794+
- (void)dismissAnimated:(BOOL)animated cleanup:(BOOL)cleanup
773795
{
774-
if (self.willDismissHandler) {
796+
BOOL isVisible = self.isVisible;
797+
798+
if (isVisible && self.willDismissHandler) {
775799
self.willDismissHandler(self);
776800
}
777801

778802
void (^dismissComplete)(void) = ^{
779-
// self.visible = NO;
780-
//
781-
// [self.alertWindow removeFromSuperview];
782-
// self.alertWindow = nil;
783-
// self.viewController = nil;
784-
//
785-
// [[SIAlertView sharedQueue] removeObject:self];
786-
//
787-
// [SIAlertView setAnimating:NO];
788-
//
789-
// if (self.didDismissHandler) {
790-
// self.didDismissHandler(self);
791-
// }
803+
self.visible = NO;
792804

793-
[SIAlertView cleanUpForAlertView:self];
805+
[self.alertWindow removeFromSuperview];
806+
self.alertWindow = nil;
807+
self.viewController = nil;
794808

795-
if ([SIAlertView sharedQueue].count > 0) {
796-
797-
SIAlertView *alert = [[SIAlertView sharedQueue] lastObject];
798-
799-
[alert show];
800-
801-
// if (alert.viewController) {
802-
// // show previous alert
803-
// alert.alertWindow.hidden = NO;
804-
// alert.visible = YES;
805-
//
806-
// // transition in again
807-
// [alert.viewController transitionInCompletion:^{
808-
// [SIAlertView setAnimating:NO];
809-
//
810-
// [self showNextIfNeededForAlert:alert];
811-
// }];
812-
// } else {
813-
// // show new added alert
814-
// [alert show];
815-
// }
809+
[SIAlertView setCurrentAlertView:nil];
810+
811+
SIAlertView *nextAlertView;
812+
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:self];
813+
if (index < [SIAlertView sharedQueue].count - 1) {
814+
nextAlertView = [SIAlertView sharedQueue][index + 1];
815+
}
816+
817+
if (cleanup) {
818+
[[SIAlertView sharedQueue] removeObject:self];
819+
}
820+
821+
[SIAlertView setAnimating:NO];
822+
823+
if (isVisible && self.didDismissHandler) {
824+
self.didDismissHandler(self);
825+
}
826+
827+
if (nextAlertView) {
828+
[nextAlertView show];
829+
} else {
830+
// show last alert view
831+
if ([SIAlertView sharedQueue].count > 0) {
832+
SIAlertView *alert = [[SIAlertView sharedQueue] lastObject];
833+
[alert show];
834+
}
816835
}
817836
};
818837

819-
if (animated) {
838+
if (animated && isVisible) {
820839
[SIAlertView setAnimating:YES];
821840
[self.viewController transitionOutCompletion:dismissComplete];
822841

@@ -827,33 +846,22 @@ - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)anim
827846
} else {
828847
dismissComplete();
829848

830-
if ([SIAlertView sharedQueue].count == 1) {
849+
if ([SIAlertView sharedQueue].count == 0) {
831850
[[SIAlertView sharedBackground] hideAnimated:NO];
832851
}
833852
}
834853
}
835854

836-
#pragma mark - Private
837-
838-
+ (void)showNextIfNeededForAlert:(SIAlertView *)alert
839-
{
840-
NSInteger index = [[SIAlertView sharedQueue] indexOfObject:alert];
841-
if (index < [SIAlertView sharedQueue].count - 1) {
842-
SIAlertView *alert = [SIAlertView sharedQueue][index + 1];
843-
[alert show];
844-
}
845-
}
846-
847855
#pragma mark - SIAlertViewControllerDelegate
848856

849857
- (void)viewController:(SIAlertViewController *)viewController clickedButtonIndex:(NSInteger)buttonIndex
850858
{
851-
[SIAlertView setAnimating:YES];
859+
[SIAlertView setAnimating:YES]; // set this flag to YES in order to prevent showing another alert in action block
852860
SIAlertItem *item = self.items[buttonIndex];
853861
if (item.action) {
854862
item.action(self);
855863
}
856-
[self dismissWithClickedButtonIndex:buttonIndex animated:YES];
864+
[self dismissAnimated:YES];
857865
}
858866

859867
#pragma mark - UIAppearance getters

SIAlertViewExample/SIAlertViewExample/ViewController.m

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,27 @@ - (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];
60+
61+
double delayInSeconds = 1.0;
62+
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
63+
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
64+
NSLog(@"1=====");
65+
[alertView dismissAnimated:YES];
66+
NSLog(@"2=====");
67+
});
6068
}
6169

6270
- (IBAction)alert2:(id)sender
@@ -79,6 +87,20 @@ - (IBAction)alert2:(id)sender
7987
alertView.cornerRadius = 10;
8088
alertView.buttonFont = [UIFont boldSystemFontOfSize:15];
8189
alertView.transitionStyle = SIAlertViewTransitionStyleBounce;
90+
91+
alertView.willShowHandler = ^(SIAlertView *alertView) {
92+
NSLog(@"%@, willShowHandler2", alertView);
93+
};
94+
alertView.didShowHandler = ^(SIAlertView *alertView) {
95+
NSLog(@"%@, didShowHandler2", alertView);
96+
};
97+
alertView.willDismissHandler = ^(SIAlertView *alertView) {
98+
NSLog(@"%@, willDismissHandler2", alertView);
99+
};
100+
alertView.didDismissHandler = ^(SIAlertView *alertView) {
101+
NSLog(@"%@, didDismissHandler2", alertView);
102+
};
103+
82104
[alertView show];
83105
}
84106

@@ -96,6 +118,20 @@ - (IBAction)alert3:(id)sender
96118
NSLog(@"OK Clicked");
97119
}];
98120
alertView.transitionStyle = SIAlertViewTransitionStyleDropDown;
121+
122+
alertView.willShowHandler = ^(SIAlertView *alertView) {
123+
NSLog(@"%@, willShowHandler3", alertView);
124+
};
125+
alertView.didShowHandler = ^(SIAlertView *alertView) {
126+
NSLog(@"%@, didShowHandler3", alertView);
127+
};
128+
alertView.willDismissHandler = ^(SIAlertView *alertView) {
129+
NSLog(@"%@, willDismissHandler3", alertView);
130+
};
131+
alertView.didDismissHandler = ^(SIAlertView *alertView) {
132+
NSLog(@"%@, didDismissHandler3", alertView);
133+
};
134+
99135
[alertView show];
100136
}
101137

0 commit comments

Comments
 (0)