@@ -32,6 +32,7 @@ - (void)viewController:(SIAlertViewController *)viewController clickedButtonInde
3232static NSMutableArray *__si_alert_queue;
3333static BOOL __si_alert_animating;
3434static 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
0 commit comments