2つのアラートが1つずつ表示される場合、1つのアラートが表示され、その上に別のアラートが表示され、アプリがクラッシュすることを意味します。 UIAlertController
を使用してアラートを表示しました。 iOS 9デバイスでのみアプリがクラッシュします。
この時点で私を助けてください。
これは、supportedInterfaceOrientations
のUIAlertController
の取得に失敗したというiOS 9のバグです。そして、supportedInterfaceOrientations
の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
は、無限ループなしで、サポートされている方向の値を直接返します。それが役に立てば幸い。
編集:Swift 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関数が実際にIntではなくUIInterfaceOrientationMaskを返すことです。
このバリアントでは、すべての方向がサポートされています。
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
ベータ版でこの問題に直面していました。しかし、AppleはiOS 9
の最終リリースで解決されました。
これは、新しく作成されたUIWindowにアラートコントローラーを常に表示することでも解決できます。この方法でアラートを常に表示できるカテゴリを作成する方法については、 this SO answer を参照してください。