39

当两个警报一一出现时,我的意思是一个警报出现,另一个警报出现并且应用程序崩溃。我曾经UIAlertController显示警报。应用程序仅在 iOS 9 设备中崩溃。

请在这一点上帮助我。

4

7 回答 7

76

这是 iOS 9 中的一个错误,它无法检索supportedInterfaceOrientationsfor UIAlertController. supportedInterfaceOrientations并且它似乎在寻找for时陷入了无限递归循环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将直接返回支持的方向值,没有无限循环。希望能帮助到你。

编辑:斯威夫特 3.0.1

extension UIAlertController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.portrait
    }  
    open override var shouldAutorotate: Bool {
        return false
    }
}
于 2015-08-14T12:48:42.417 回答
16

我的解决方案是 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
于 2015-09-18T08:42:41.590 回答
6

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

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

extension UIAlertController {

    public override func shouldAutorotate() -> Bool {
        return true
    }

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.All
    }
}
于 2016-04-07T12:34:17.490 回答
3

写一个扩展对我来说似乎是合乎逻辑的,但我得到了

覆盖“shouldAutorotate”必须与它覆盖的声明一样可用

执行时出错。但我找到了另一个解决方案。我写了一个类,它扩展了 UIAlertController 并覆盖了该类中的supportedInterfaceOrientations函数shouldAutorotate。希望这可以帮助。

class MyUIAlertController : UIAlertController {

       override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
              return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown]
       }

       override func shouldAutorotate() -> Bool {
            return false
       }
}
于 2015-09-22T13:33:50.140 回答
2

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

于 2015-09-26T13:25:31.067 回答
0

这也可以通过始终在新创建的 UIWindow 中显示警报控制器来解决。请参阅此 SO 答案,了解如何创建允许您始终以这种方式显示警报的类别。

于 2016-01-12T23:02:15.293 回答
0

在我的项目中,我有各种支持各种方向的屏幕,因此一个通用扩展是不够的。

我的解决方案(Swift 5.2):

import UIKit

class UIAlertControllerWithOrientationSupport : UIAlertController {

    var fixSupportedInterfaceOrientations: UIInterfaceOrientationMask = .allButUpsideDown
    var fixShouldAutorotate: Bool = true

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return fixSupportedInterfaceOrientations
    }

    override var shouldAutorotate: Bool {
        return fixShouldAutorotate
    }

}
于 2020-03-09T11:04:28.263 回答