当多个警报视图出现在同一个视图控制器中时,有没有办法交错?

Posted

技术标签:

【中文标题】当多个警报视图出现在同一个视图控制器中时,有没有办法交错?【英文标题】:Is there a way to stagger when multiple Alert Views show up in the same View Controller? 【发布时间】:2015-04-23 18:35:53 【问题描述】:

所以我在同一个视图控制器中有两个不同的 UIAlertViews,两个警报可以同时触发。当两个警报都被触发时,两个警报同时弹出,警报相互叠加。有没有办法错开警报,以便当第一个警报出现时,第二个警报不会弹出,直到用户关闭第一个警报?对于我的代码,这是我正在使用的格式

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"ERROR!"
                                                    message:@"Error message here!"
                                                   delegate:self
                                          cancelButtonTitle:@"Ok"
                                          otherButtonTitles:nil];
[alertView show];

【问题讨论】:

您可以添加tag来区分警报视图。 【参考方案1】:

尝试以下方法:

创建两个属性

@property (weak, nonatomic) UIAlertView *visibleAlertView;
@property (strong, nonatomic) UIAlertView *pendingAlertView;

每当您想从代码中显示警报视图时,请检查

UIAlertView *newAlertView = [[UIAlertView alloc] init...
if (self.visibleAlertView) 
    self.pendingAlertView = newAlertView;
 else 
    self.visibleAlertView = newAlertView;
    [newAlertView show];

最后:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
    if (self.pendingAlertView) 
        UIAlertView *newAlertView = self.pendingAlertView;
        self.pendingAlertView = nil;
        self.visibleAlertView = newAlertView;
        [newAlertView show];
    

希望有帮助:)

编辑

您甚至可以堆叠待处理的警报视图:

@property (strong, nonatomic) NSMutableArray *pendingAlertViews;
...
self.pendingAlertViews = [NSMutableArray array];

在呈现警报视图之前:

UIAlertView *newAlertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
if (self.visibleAlertView) 
    [self.pendingAlertViews addObject:newAlertView];
 else 
    self.visibleAlertView = newAlertView;
    [newAlertView show];

在解雇中:

if (self.pendingAlertViews.count > 0) 
    UIAlertView *av = self.pendingAlertViews.firstObject;
    [self.pendingAlertViews removeObjectAtIndex:0];
    self.visibleAlertView = av;
    [av show];

希望对你有帮助:)

【讨论】:

这行用于堆叠警报视图的代码存在问题:[self.pendingAlertViews addObject:newAlertView]; 它说:UIAlertView 没有可见的@interface 声明选择器 addObject。我发现第一个答案非常好,但堆叠方法没有。现在,应该首先显示的警报视图执行,然后在下一个警报视图出现之前有一个暂停。我认为暂停可能已经内置到警报视图中,但我真的只是在寻找一种方法来让正确的视图在正确的时间出现。谢谢! 你把@property (strong, nonatomic) UIAlertView *pendingAlertView;改成@property (strong, nonatomic) NSMutableArray *pendingAlertViews;了吗? 我实际上没有注意到您所做的更改!但是,第一种方法效果很好,所以除非出现问题,否则我现在会坚持使用它!谢谢! 好吧...如果您想使用最多两个彼此跟随的警报视图,则第一种方法很好。如果您需要使用第二个版本 - 如果您按照上面的方式进行设置,这也可以使用;) 好吧,我正在尝试使用最多两个警报视图,这就是为什么第一个现在可以正常工作的原因。我毫不怀疑另一种方法也有效。 ;)【参考方案2】:

您为什么不创建一个指示警报视图已打开的类级别变量。然后在你打开一个之前检查那个变量,如果它设置了你就不会弹出第二个。相反,您可以让它设置另一个变量,指示应该弹出第二个框。然后在 -alertView:clickedButtonAtIndex: 方法中,如果设置了第二个变量,则可以弹出第二个。

【讨论】:

【参考方案3】:

我想我已经很晚了,但仍然发布它可能对寻找这个的人有用。

我为 UIAlertAction 创建了 AQAlertAction 子类。您可以将它用于交错警报,用法与您使用 UIAlertAction 相同。您需要做的就是在您的项目中导入AQMutiAlertFramework,或者您也可以包含类(请参阅Sample project)。在内部,它使用二进制信号量来错开警报,直到用户处理与显示当前警报相关的操作。让我知道它是否适合你。

【讨论】:

以上是关于当多个警报视图出现在同一个视图控制器中时,有没有办法交错?的主要内容,如果未能解决你的问题,请参考以下文章

当期望值不在视图包中时重定向到登录页面

当警报首次出现在 iOS 中时,是不是可以自定义蓝牙消息

当视图出现在 SwiftUI 中时禁用动画

当 SnackBar 出现在 CoordinatorLayout 中时上移视图

在所有视图控制器中创建警报功能 - swift

ios - 可达性通知多个警报