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.
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
}
}
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
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
}
}
É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
}
}
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
.
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.