如何在显示 2 个警报之间暂停代码

Posted

技术标签:

【中文标题】如何在显示 2 个警报之间暂停代码【英文标题】:How to pause code between the display of 2 alerts 【发布时间】:2016-11-02 20:12:46 【问题描述】:

我有一些 ios 代码需要能够显示 2 个背靠背警报。当用户在第一个警报上单击“确定”时,我需要显示第二个警报。因为显示警报不会“暂停”代码,所以我的第二个警报几乎与我的第一个警报同时显示并且事情中断(第二个警报不显示)。

我需要一种在显示第一个警报时暂停代码的方法。一旦用户在第一个警报上单击“确定”,它就可以显示第二个警报。

在继续第二个警报之前等待第一个警报完成的正确方法是什么?

这是我的完整代码,以防万一。每个警报都由一个条件触发。如果这两个条件都为真,那么我会遇到我描述的背靠背警报问题。

    UIAlertController* alert;
    UIAlertAction* defaultAction;
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if(status != kCLAuthorizationStatusAuthorizedAlways) 
        alert = [UIAlertController alertControllerWithTitle:@"Warning"
                                                    message:@"Reminder will not work unless you enable 'Always' location."
                                             preferredStyle:UIAlertControllerStyleAlert];

        defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * action) ];


        [alert addAction:defaultAction];
        [self presentViewController:alert animated:YES completion:nil];

    


    UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    if(settings.types==0) 
        alert = [UIAlertController alertControllerWithTitle:@"Warning"
                                                    message:@"Reminder will not work unless you enable notifications."
                                             preferredStyle:UIAlertControllerStyleAlert];

        defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * action) ];

        [alert addAction:defaultAction];
        [self presentViewController:alert animated:YES completion:nil];
    

【问题讨论】:

添加后续评论,因为我的代码正在运行。据我所知,没有办法“暂停”代码以等待用户在警报上点击 OK。我曾经尝试过 - 当用户点击 OK 时设置一个标志并等待该标志设置后再继续。这个等待循环使我的 UI 崩溃了。最终的解决方案是检查是否需要显示 2 个警报,如果是这种情况,则在传递给第一个警报的代码块内显示第二个警报(下面的解决方案 1) 【参考方案1】:

您所要做的只是处理程序中的第二个警报:

UIAlertController* alert;
UIAlertAction* defaultAction;
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if(status != kCLAuthorizationStatusAuthorizedAlways) 
    alert = [UIAlertController alertControllerWithTitle:@"Warning"
                                                message:@"Reminder will not work unless you enable 'Always' location."
                                         preferredStyle:UIAlertControllerStyleAlert];

    defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction * action) 

        UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];

        if(settings.types==0) 

            inner_alert = [UIAlertController alertControllerWithTitle:@"Warning"
                                                message:@"Reminder will not work unless you enable notifications."
                                         preferredStyle:UIAlertControllerStyleAlert];

            inner_defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction * action) ];

            [inner_alert addAction:inner_defaultAction];
            [self presentViewController:inner_alert animated:YES completion:nil];
        
    ];


    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];


这样,当您点击“确定”时,它将调用第二个警报的代码。

【讨论】:

感谢您的建议。我花了一段时间才意识到您将第二个警报放在传递给第一个警报的块中。不过,我需要的是一种干净的方式来处理显示警报 A、警报 B 或同时显示警报 A 和 B。在不需要警报 A 的情况下,我需要添加更多代码来处理警报 B。我想我可以做到这一点。 @Morocco5,是的,您必须包含一个条件来检查何时调用它。这就是您一次发出两个警报的方式。如果这回答了您的问题,请将其标记为正确并投票。【参考方案2】:

可以在@interface中设置一个变量,在viewDidLoad中设置为0

@interface ViewController ()
    @property (nonatomic) int number;
@end

- (void)viewDidLoad 
    [super viewDidLoad];
    self.number = 0;


然后创建函数来显示警报并通过 switch(self.number) 调用其他警报,或者您可以再次调用 showAlert 本身。

    - (void) showAlert 

    UIAlertController *alert = [UIAlertController alertController WithTitle:@"ALERT" message:@"" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) 

        switch (self.number) 
            case 0:
            self.number = 1;                
            [self secondAlert]; // other alert function
                break;
            case 1:
            [self thirdAlert];
            default:
            break;
            
    ];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"CANCEL" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) 

            ];

    [alert addAction:okAction];
    [alert addAction:cancelAction];

            [self presentViewController:alert animated:YES completion:nil];

【讨论】:

以上是关于如何在显示 2 个警报之间暂停代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定时间打盹普罗米修斯警报

如何在 SwiftUI 中一个接一个地显示多个警报对话框?

在 Grafana 中创建警报 - 基于 2 个时间序列之间的增量

如何在警报视图中的文本之间添加图像?

按下标签栏项目时如何显示警报视图以及在其他目标中使用时如何忽略它?

如何在正在运行的线程中显示警报对话框?