当两个警报逐个呈现时,我表示存在一个警报,而另一个警报呈现并且应用程序崩溃。
我使用UIAlertController
来显示警报。应用程序仅在iOS 9设备中崩溃。
请帮助我。
答案 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的类,并覆盖了该类中的supportedInterfaceOrientations
和shouldAutorotate
函数。希望这会有所帮助。
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
}
}