Как поставить код на паузу между отображением 2 предупреждений

У меня есть код 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];
    }

person Morocco5    schedule 02.11.2016    source источник
comment
Добавление последующего комментария теперь, когда мой код работает. Из того, что я понял, нет способа приостановить код, чтобы дождаться, когда пользователь нажмет «ОК» в предупреждении. Я попробовал это в какой-то момент - установить флаг, когда пользователь нажимает «ОК», и ждать, пока этот флаг будет установлен, прежде чем двигаться дальше. Этот цикл ожидания разбил мой пользовательский интерфейс. Окончательное решение состояло в том, чтобы проверить, нужно ли отображать 2 предупреждения, и если это так, то отображение второго предупреждения внутри блока кода, переданного в первое предупреждение (решение 1 ниже)   -  person Morocco5    schedule 08.11.2016


Ответы (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) {

        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];

}

Таким образом, когда вы нажмете «ОК», он вызовет код для второго предупреждения.

person Wyetro    schedule 02.11.2016
comment
Спасибо за ваше предложение. Мне потребовалось некоторое время, чтобы понять, что вы помещаете второе предупреждение в блок, который передается в первое предупреждение. Что мне нужно, так это чистый способ обработки отображения предупреждений A, предупреждений B или обоих предупреждений A и B. Мне нужно добавить дополнительный код для обработки предупреждений B в случае, когда предупреждение A не требуется. Думаю, я мог бы это сделать. - person Morocco5; 04.11.2016
comment
@ Morocco5, да, вам нужно будет включить условие, чтобы проверить, когда его вызывать. Это именно то, как вы делаете два предупреждения одновременно. Если это отвечает на ваш вопрос, отметьте его как правильный и проголосуйте за него. - person Wyetro; 04.11.2016

Вы можете установить переменную в @interface и установить для нее значение 0 в viewDidLoad.

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

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

}

Затем создайте функцию для отображения оповещения и вызовите другое оповещение с помощью переключателя (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];
person Ryan    schedule 02.11.2016