web-dev-qa-db-ja.com

UIAlertController:supportedInterfaceOrientationsが再帰的に呼び出されました

2つのアラートが1つずつ表示される場合、1つのアラートが表示され、その上に別のアラートが表示され、アプリがクラッシュすることを意味します。 UIAlertControllerを使用してアラートを表示しました。 iOS 9デバイスでのみアプリがクラッシュします。

この時点で私を助けてください。

39
Ashvin Ajadiya

これは、supportedInterfaceOrientationsUIAlertControllerの取得に失敗したというiOS 9のバグです。そして、supportedInterfaceOrientationsUIAlertControllerを探す際に無限再帰ループに落ちたようです(たとえば、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
    }
}
75
Annie

私のソリューションは、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
16
Jim Holland

上記のRoland Keesomの回答の更新として、これが私にとってうまくいったことです。主な違いは、supportedInterfaceOrientations関数が実際にIntではなくUIInterfaceOrientationMaskを返すことです。

このバリアントでは、すべての方向がサポートされています。

extension UIAlertController {

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

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

拡張機能を書くことは論理的に思えましたが、

「shouldAutorotate」のオーバーライドは、オーバーライドする宣言と同じように使用可能でなければなりません

実装中にエラーが発生しました。しかし、私は別の解決策を見つけました。 UIAlertControllerを拡張するクラスを作成し、そのクラスのsupportedInterfaceOrientationsおよびshouldAutorotate関数をオーバーライドしました。お役に立てれば。

class MyUIAlertController : UIAlertController {

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

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

私はiOS 9ベータ版でこの問題に直面していました。しかし、AppleはiOS 9の最終リリースで解決されました。

2
Ashvin Ajadiya

これは、新しく作成されたUIWindowにアラートコントローラーを常に表示することでも解決できます。この方法でアラートを常に表示できるカテゴリを作成する方法については、 this SO answer を参照してください。

0
timgcarlson