Предупреждающее сообщение UIAlertController

Я использую приведенный ниже код для UIAlertController в своем проекте.

if([[[UIDevice currentDevice] systemVersion]floatValue] >= 8.0){

            UIAlertController * alert=   [UIAlertController
                                          alertControllerWithTitle:@"Input Error"
                                          message:@"Please enter a valid email."
                                          preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* okAction = [UIAlertAction
                                       actionWithTitle:@"OK"
                                       style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction * action)
                                       {
                                           [alert dismissViewControllerAnimated:YES completion:nil];

                                       }];

            [alert addAction:okAction];

            [self presentViewController:alert animated:YES completion:nil];
        }
        else
        {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Input Error"
                                                            message:@"Please enter a valid email"
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil, nil];
        [alertView show];
        }

Я получаю следующее предупреждающее сообщение:

Warning: Attempt to present <UIAlertController: 0x7f8da58df1f0>  on <MBComplaintsViewController: 0x7f8da36454d0> which is already presenting (null)

Пожалуйста, подскажите, как правильно использовать UIAlertController с помощью Objective C.

Спасибо, Абин Коши Чериян


person Mobile Developer    schedule 30.10.2015    source источник
comment
Я создал проект Github для того же, который вы можете использовать для решения проблемы: github.com/AgarwalMilan/MAAlertPresenter< /а>   -  person Milan Agarwal    schedule 13.08.2016


Ответы (2)


Да, согласно @Alexander, вы не должны явно отклонять контроллер предупреждений.

По словам инженера Apple, новое окно добавляется каждый раз, когда отображается UIAlertController, поэтому, когда мы собираемся закрыть его, окно все еще существует, хотя контроллер предупреждений исчезает.

Таким образом, есть два способа справиться с этим -

Способ 1 – без явного закрытия Не закрывайте UIAlertController явно, пусть это делает пользователь

Способ 2. Используйте собственное окно. Просто создайте категорию в UIAertController. Вот пример кода — .h

#import <UIKit/UIKit.h>

@interface UIAlertController (MyAdditions)

@property(nonatomic,strong) UIWindow *alertWindow;

-(void)show;

@end

В .m

#import "UIAlertController+MyAdditions.h"
#import <objc/runtime.h>

@implementation UIAlertController (MyAdditions)

@dynamic alertWindow;

- (void)setAlertWindow:(UIWindow *)alertWindow {
    objc_setAssociatedObject(self, @selector(alertWindow), alertWindow, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIWindow *)alertWindow {
    return objc_getAssociatedObject(self, @selector(alertWindow));
}

- (void)show {
    self.alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.alertWindow.rootViewController = [[UIViewController alloc] init];

    // window level = topmost + 1
    UIWindow *topWindow = [UIApplication sharedApplication].windows.lastObject;
    self.alertWindow.windowLevel = topWindow.windowLevel + 1;

    [self.alertWindow makeKeyAndVisible];
    [self.alertWindow.rootViewController presentViewController:self animated:YES completion:nil];
}

-(void)hide {
    self.alertWindow.hidden = YES;
    self.alertWindow = nil;
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    // just to ensure the window gets desroyed
    self.alertWindow.hidden = YES;
    self.alertWindow = nil;
}

Чтобы показать контроллер предупреждений

UIAlertCntroller *alert = ## initialisation##;
// will show the alert
[alert show];

//to dismiss 
[alert hide];

[предупреждение об отклонении ViewControllerAnimated: ДА, завершение: ноль];

Даже вы можете проверить один из моих примеров реализации здесь

person Sam92    schedule 14.04.2016

Я не знаю о вашей проблеме, но вы не должны этого делать

handler:^(UIAlertAction * action)
                                       {
                                           [alert dismissViewControllerAnimated:YES completion:nil];

                                       }];

Он в любом случае будет уволен на любом из ваших actions.

person Zaporozhchenko Oleksandr    schedule 15.11.2015