UIAlertController:supportedInterfaceOrientations是递归调用的

时间:2015-07-14 12:38:13

标签: objective-c ios9 xcode7 uialertcontroller xcode7-beta3

当两个警报逐个呈现时,我表示存在一个警报,而另一个警报呈现并且应用程序崩溃。 我使用UIAlertController来显示警报。应用程序仅在iOS 9设备中崩溃。

请帮助我。

7 个答案:

答案 0 :(得分:73)

这是iOS 9中的一个错误,它无法检索supportedInterfaceOrientations的{​​{1}}。并且它似乎在为UIAlertController寻找supportedInterfaceOrientations(例如,它追溯到UIAlertController - > UIAlertControler - > {{时,它会下降到无限递归循环1}} - > UIViewController - > UINavigationController - > ...),而对UITabBarController的调用实际上并未在源代码中实现/覆盖。

在我的解决方案中,我刚刚添加了以下代码:

UIAlertController

然后UIAlertController:supportedInterfaceOrientations将直接返回支持的方向值而没有无限循环。希望它有所帮助。

编辑:Swift 3.0.1

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

答案 1 :(得分: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

答案 2 :(得分:6)

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

在此变体中,支持所有方向。

extension UIAlertController {

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

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.All
    }
}

答案 3 :(得分:3)

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

  

覆盖'shouldAutorotate'必须与声明覆盖

一样可用
实施时出现

错误。但我找到了另一个解决方案我写了一个扩展UIAlertController的类,并覆盖了该类中的supportedInterfaceOrientationsshouldAutorotate函数。希望这会有所帮助。

class MyUIAlertController : UIAlertController {

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

       override func shouldAutorotate() -> Bool {
            return false
       }
}

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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
    }

}