UIAlertController:supportedInterfaceOrientations被recursion地调用

当两个警报一一呈现时,我意味着一个警报呈现在他们身上,另一个警报呈现和应用程序崩溃。 我用UIAlertController来显示警报。 应用程序仅在iOS 9设备中崩溃。

请帮助我在这一点上。

这是iOS 9中的一个错误,它无法检索UIAlertController 。 它似乎下降到一个无限recursion循环寻找UIAlertController (例如,它追溯到UIAlertControler – > UIViewController – > UINavigationController – > UITabBarController – > UIAlertController – > …),而调用UIAlertController:supportedInterfaceOrientations实际上没有在源代码中实现/覆盖。

在我的解决scheme中,我只是添加了以下一段代码:

 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 } } 

我的解决scheme是UIAlertViewController的Objective-C类别。 只需在使用UIAlertController的任何类中包含UIAlertController + supportedInterfaceOrientations.h即可

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 

作为Roland Keesom的回答更新,上面这个是对我有用的。 主要区别在于supportedInterfaceOrientations函数实际上返回一个UIInterfaceOrientationMask而不是一个Int。

在这个变体中,所有的方向都被支持。

 extension UIAlertController { public override func shouldAutorotate() -> Bool { return true } public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { return UIInterfaceOrientationMask.All } } 

写一个扩展名对我来说似乎很合理,但是我得到了

重写“shouldAutorotate”必须与其覆盖的声明一样可用

错误,而实施它。 但我find了另一个解决scheme 我写了一个扩展了UIAlertController的类,并且在这个类中覆盖了supportedInterfaceOrientations和shouldAutorotate函数。 希望这可以帮助。

 class MyUIAlertController : UIAlertController { override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown] } override func shouldAutorotate() -> Bool { return false } } 

我在iOS 9 beta版本中遇到了这个问题。 但似乎苹果已经解决了iOS 9最终版本。

这也可以通过在新创build的UIWindow中始终显示警报控制器来解决。 看到这个如何回答如何创build一个类别,让您总是以这种方式显示您的警报。