web-dev-qa-db-fra.com

UIAlertController: supportedInterfaceOrientations a été invoqué récursivement

Lorsque deux alertes se présentent l'une après l'autre, je veux dire une alerte présente et au-dessus d'elles une autre présentation d'alerte et le blocage de l'application. J'ai utilisé UIAlertController pour afficher l'alerte. L'application ne plante que sur un appareil iOS 9.

Veuillez m'aider à ce stade.

39
Ashvin Ajadiya

Il s'agit d'un bogue dans iOS 9 qui n'a pas pu récupérer le supportedInterfaceOrientations pour UIAlertController. Et il semble qu'il soit tombé dans une boucle de récursivité infinie à la recherche de supportedInterfaceOrientations pour UIAlertController (par exemple, il revient à UIAlertControler -> UIViewController -> UINavigationController -> UITabBarController -> UIAlertController -> ...), tandis que l'appel à UIAlertController:supportedInterfaceOrientations n'est en fait pas implémenté/remplacé dans le code source.

Dans ma solution, je viens d'ajouter le morceau de code suivant:

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

UIAlertController renverra directement la valeur d'orientation prise en charge sans boucle infinie. J'espère que cela aide.

Modifier: Swift 3.0.1

extension UIAlertController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.portrait
    }  
    open override var shouldAutorotate: Bool {
        return false
    }
}
75
Annie

Ma solution est une catégorie Objective-C pour UIAlertViewController. Incluez simplement UIAlertController + supportedInterfaceOrientations.h dans toutes les classes qui utilisent UIAlertController

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

En tant que mise à jour de la réponse de Roland Keesom, ci-dessus, c'est ce qui a fonctionné pour moi. La principale différence est que la fonction supportedInterfaceOrientations renvoie en fait un UIInterfaceOrientationMask plutôt qu'un Int.

Et dans cette variante, toutes les orientations sont prises en charge.

extension UIAlertController {

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

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

Écrire une extension m'a semblé logique mais j'ai

Le remplacement de "shouldAutorotate" doit être aussi disponible que la déclaration qu'il remplace

erreur lors de sa mise en œuvre. Mais j'ai trouvé une autre solution. J'ai écrit une classe qui étend UIAlertController et a remplacé les fonctions supportedInterfaceOrientations et shouldAutorotate dans cette classe. J'espère que cela t'aides.

class MyUIAlertController : UIAlertController {

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

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

J'étais confronté à ce problème dans iOS 9 version (s) bêta. Mais il semble que Apple a résolu dans la version finale de iOS 9.

2
Ashvin Ajadiya

Cela peut également être résolu en affichant toujours le contrôleur d'alerte dans une nouvelle fenêtre UIWindow. Voir this SO answer sur la façon de créer une catégorie qui vous permet de toujours afficher vos alertes de cette façon.

0
timgcarlson