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一个类别,让您总是以这种方式显示您的警报。