Авария 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];
этот код находится в приложении в течение длительного времени, и теперь он начинает сбой. Кто-нибудь испытал подобное поведение и устранил проблему?
Ответы
Ответ 1
попробуйте реализовать этот
- (BOOL)shouldAutorotate {
return NO;
}
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
проверьте это также: Проблема с ориентацией в режиме Lanscape при открытии камеры в iOS 7 на iPhone
Ответ 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