当两个警报一一出现时,我的意思是一个警报出现,另一个警报出现并且应用程序崩溃。我曾经UIAlertController
显示警报。应用程序仅在 iOS 9 设备中崩溃。
请在这一点上帮助我。
当两个警报一一出现时,我的意思是一个警报出现,另一个警报出现并且应用程序崩溃。我曾经UIAlertController
显示警报。应用程序仅在 iOS 9 设备中崩溃。
请在这一点上帮助我。
这是 iOS 9 中的一个错误,它无法检索supportedInterfaceOrientations
for 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
}
}
我的解决方案是 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”必须与它覆盖的声明一样可用
执行时出错。但我找到了另一个解决方案。我写了一个类,它扩展了 UIAlertController 并覆盖了该类中的supportedInterfaceOrientations
函数shouldAutorotate
。希望这可以帮助。
class MyUIAlertController : UIAlertController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown]
}
override func shouldAutorotate() -> Bool {
return false
}
}
我在iOS 9
测试版中遇到了这个问题。但似乎苹果在最终版本中解决了iOS 9
.
这也可以通过始终在新创建的 UIWindow 中显示警报控制器来解决。请参阅此 SO 答案,了解如何创建允许您始终以这种方式显示警报的类别。
在我的项目中,我有各种支持各种方向的屏幕,因此一个通用扩展是不够的。
我的解决方案(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
}
}