UIAlertController: поддерживаетсяInterfaceOrientations вызывается рекурсивно
Когда два оповещения появляются один за другим, я подразумеваю присутствие одного предупреждения и над ним появляется другое предупреждение и сбой приложения.
Я использовал UIAlertController
для отображения предупреждения. Ошибка приложения только в устройстве iOS 9.
Пожалуйста, помогите мне на этом этапе.
Ответы
Ответ 1
Это ошибка в iOS 9, которая не смогла получить supportedInterfaceOrientations
для UIAlertController
. И кажется, что он упал до бесконечной петли рекурсии при поиске supportedInterfaceOrientations
для UIAlertController
(например, он возвращается к UIAlertControler
→ UIViewController
→ UINavigationController
→ UITabBarController
→ UIAlertController
→ ...), в то время как вызов UIAlertController:supportedInterfaceOrientations
фактически не реализован/переопределен в исходном коде.
В моем решении я просто добавил следующий фрагмент кода:
extension UIAlertController {
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
public override func shouldAutorotate() -> Bool {
return false
}
}
Затем UIAlertController
будет напрямую возвращать поддерживаемое значение ориентации без бесконечного цикла. Надеюсь, что это поможет.
Изменить: Swift 3.0.1
extension UIAlertController {
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.portrait
}
open override var shouldAutorotate: Bool {
return false
}
}
Ответ 2
Мое решение - это категория Objective-C для UIAlertViewController. Просто включите UIAlertController + supportedInterfaceOrientations.h в любых классах, которые используют UIAlertController
UIAlertController + supportedInterfaceOrientations.h
//
// UIAlertController+supportedInterfaceOrientations.h
#import <UIKit/UIKit.h>
@interface UIAlertController (supportedInterfaceOrientations)
@end
UIAlertController + supportedInterfaceOrientations.m
//
// UIAlertController+supportedInterfaceOrientations.m
#import "UIAlertController+supportedInterfaceOrientations.h"
@implementation UIAlertController (supportedInterfaceOrientations)
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
#endif
@end
Ответ 3
В качестве ответа на вопрос Roland Keesom выше, это то, что сработало для меня. Основное отличие состоит в том, что функция supportedInterfaceOrientations фактически возвращает UIInterfaceOrientationMask, а не Int.
И в этом варианте поддерживаются все ориентации.
extension UIAlertController {
public override func shouldAutorotate() -> Bool {
return true
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.All
}
}
Ответ 4
Написание расширения казалось логичным для меня, но я получил
Переопределение "shouldAutorotate" должно быть таким же доступным, как и объявление, которое оно переопределяет
при его реализации. Но я нашел другое решение. Я написал класс, который расширяет UIAlertController и переопределяет функции supportedInterfaceOrientations
и shouldAutorotate
в этом классе. Надеюсь, это поможет.
class MyUIAlertController : UIAlertController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown]
}
override func shouldAutorotate() -> Bool {
return false
}
}
Ответ 5
Я столкнулся с этой проблемой в бета-версиях iOS 9
. Но похоже, что яблоко разрешилось в финальном выпуске iOS 9
.
Ответ 6
Это также можно решить, всегда отображая контроллер предупреждений во вновь создаваемом интерфейсе UIWindow. См. этот SO ответ о том, как создать категорию, которая позволяет всегда отображать ваши предупреждения таким образом.