Авария UIAlertView в iOS 8.3

Недавно я начал получать отчеты о сбоях для UIAlertView только для пользователей, использующих iOS 8.3

Отчеты Crashlytics:

Фатальное исключение: UIApplicationInvalidInterfaceOrientation Поддерживаемые ориентации не имеют общей ориентации с приложением, а [_UIAlertShimPresentingViewController shouldAutorotate] возвращает YES

Линия, в которой произошла авария, показана [alertView show]:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                    message:message
                                                   delegate:nil
                                          cancelButtonTitle:cancelButtonTitle
                                          otherButtonTitles:nil];
[alertView show];

этот код находится в приложении в течение длительного времени, и теперь он начинает сбой. Кто-нибудь испытал подобное поведение и устранил проблему?

Ответ 2

Главное:

UIApplicationInvalidInterfaceOrientation Поддерживаемые ориентации не имеют общей ориентации с приложением

Это означает, что вы где-то реализовали

- (NSUInteger)supportedInterfaceOrientations {

    return UIDeviceOrientationPortrait; // or UIInterfaceOrientationPortrait
}

UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait = 0

В этой функции ДОЛЖНО быть возвращена Маска, например:

UIInterfaceOrientation Маска Портрет, который 1

Ответ 3

Лучше этого вы должны начать использовать UIAlertController. Он имеет гораздо лучшую функциональность, а также для UIAlertAction вам не нужно включать методы делегата.

UIAlertController * alert=   [UIAlertController
                             alertControllerWithTitle:@"Info"
                             message:@"You are using UIAlertController"
                             preferredStyle:UIAlertControllerStyleAlert];

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

                    }];

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

                       }];

[alert addAction:ok];

[alert addAction:cancel];

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

Ответ 4

Важная: UIAlertView устарела в iOS 8. (Обратите внимание, что UIAlertViewDelegate также устарел.) Для создания и управления предупреждениями в iOS 8 и позже вместо этого используйте UIAlertController с предпочтительнымStyle UIAlertControllerStyleAlert.

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIAlertView_Class/index.html

Ответ 5

Попробовав решения здесь, никто из них не работал у меня. Я поддерживаю iOS 6-8 в приложении и, более того, использую некоторые библиотеки, которые используют UIAlertView внутренне, поэтому просто условная компиляция для использования UIAlertController, когда она недоступна, не является вариантом.

Я придумал решение, которое решило проблему для меня. Ваш пробег может отличаться. Я включаю заголовочный файл в файле заголовка заголовка, чтобы он был включен везде, где отображается UIAlertView.

Я размещаю это здесь для тех, кто наткнулся на эту проблему, и решения, найденные в сети, не работают. Надеюсь, это поможет.

https://gist.github.com/joshhudnall/cdc89b61d0a545c85d1d

Ответ 6

Я создал помощник для отображения UIAlertView, когда перед iOS8 и UIAlertController после iOS8, это решает крушение вращения и также хорошо отображается во всех версиях.

https://github.com/dannyshmueli/DSAlertDisplayer