UIAlertController исчезает с iOS 13 - PullRequest
       56

UIAlertController исчезает с iOS 13

0 голосов
/ 28 сентября 2019

У меня есть следующая функция, которая выскакивает UIAlert, который позволяет пользователю обновить настройку Haptic Feedback:

- (void)requestHapticSetting{
    UIWindow *alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    alertWindow.rootViewController = [[UIViewController alloc] init];
    alertWindow.windowLevel = UIWindowLevelAlert + 1;
    [alertWindow makeKeyAndVisible];

    if(isHapticOn){
        hapticMessage = @"Haptic feedback is currently\nturned ON.\nPlease update preference.";
    }
    else {
        hapticMessage = @"Haptic feedback is currently\nturned OFF.\nPlease update preference.";
    }

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Haptic Setting"
                                                                   message:hapticMessage
                                                            preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* onAction = [UIAlertAction actionWithTitle:@"TURN ON" style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction * action) {
                                                         [self saveHapticSettingOn];
                                                     }];

    UIAlertAction* offAction = [UIAlertAction actionWithTitle:@"TURN OFF" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {
                                                          [self saveHapticSettingOff];
                                                      }];
    [alert addAction:offAction];
    [alert addAction:onAction];
    [alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}

Я использовал это в течение нескольких лет, и она прекрасно работает.

Однако, после обновления до iOS 13 и обновления до последней версии Xcode мое предупреждение всплывает менее чем за секунду до закрытия.

Что изменилось, что могло сделать это возможным?Заранее спасибо.

1 Ответ

2 голосов
/ 29 сентября 2019

Что, кажется, изменилось, так это то, что в iOS 12 и предыдущих версиях ваше приложение будет иметь сильную ссылку на окно, просто вызывая [alertWindow makeKeyAndVisible];, в iOS 13 оно больше не будет.

Что происходитявляется то, что единственная надежная ссылка на ваш alertWindow находится в вашем requestHapticSetting функционале, и как только этот функционал вернется, окно будет уничтожено, что приведет к удалению вашего предупреждения из представления.

Это может быть исправленопросто приняв iOS 13 сцены, но я не проверял это.То, что я могу предложить, что не будет работать должным образом, если вы используете сцены , это удерживает ваше окно предупреждений в сильной переменной где-то в вашем коде, а затем использует его для представления предупреждения.Я бы предложил сделать это в одиночном приложении или в самом AppDelegate.

//AppDelegate.h
...
@property (strong) UIWindow *alertWindow;
....

//AppDelegate.m
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    self.alertWindow = [[UIWindow alloc] init];
    self.alertWindow.rootViewController = [[UIViewController alloc] init];
    self.alertWindow.windowLevel = UIWindowLevelAlert + 1;
    ...
}
...

//Your class that's presenting the alert
#import "AppDelegate.h"
...
- (void)requestHapticSetting{
    AppDelegate *appDelegate = (AppDelegate *)UIApplication.sharedApplication;
    [alertWindow makeKeyAndVisible];
    if(isHapticOn){
        hapticMessage = @"Haptic feedback is currently\nturned ON.\nPlease update preference.";
    } else {
        hapticMessage = @"Haptic feedback is currently\nturned OFF.\nPlease update preference.";
    }

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Haptic Setting"
                                                               message:hapticMessage
                                                        preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* onAction = [UIAlertAction actionWithTitle:@"TURN ON" style:UIAlertActionStyleDefault
                                                 handler:^(UIAlertAction * action) {
                                                      [self saveHapticSettingOn];
                                                      [((AppDelegate *)UIApplication.sharedApplication).alertWindow setHidden:YES];
                                                 }];

    UIAlertAction* offAction = [UIAlertAction actionWithTitle:@"TURN OFF" style:UIAlertActionStyleDefault
                                                  handler:^(UIAlertAction * action) {
                                                      [self saveHapticSettingOff];
                                                      [((AppDelegate *)UIApplication.sharedApplication).alertWindow setHidden:YES];
                                                  }];
    [alert addAction:offAction];
    [alert addAction:onAction];
    [alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}

Для кода Swift отметьте этот ответ .

...