objective c - UIAlertController: supportedInterfaceOrientations fue invocado recursivamente
objective-c ios9 (6)
Cuando dos alertas se presentan una a una, me refiero a un presente de alerta y sobre ellos otra alerta que se presenta y se bloquea la aplicación. He usado UIAlertController
para mostrar la alerta. La aplicación se bloquea solo en el dispositivo con iOS 9.
Por favor, ayúdame en este punto.
Como una actualización de la respuesta de Roland Keesom, arriba, esto es lo que funcionó para mí. La principal diferencia es que la función supportedInterfaceOrientations realmente devuelve una UIInterfaceOrientationMask en lugar de una Int.
Y en esta variante todas las orientaciones son compatibles.
extension UIAlertController {
public override func shouldAutorotate() -> Bool {
return true
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.All
}
}
Escribir una extensión me pareció lógico pero obtuve
La anulación de ''shouldAutorotate'' debe estar tan disponible como la declaración que anule
error mientras lo estaba implementando. Pero encontré otra solución. Escribí una clase que amplía UIAlertController y anuló supportedInterfaceOrientations
y shouldAutorotate
functions en esa clase. Espero que esto ayude.
class MyUIAlertController : UIAlertController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown]
}
override func shouldAutorotate() -> Bool {
return false
}
}
Estaba enfrentando este problema en iOS 9
versión (s) beta. Pero parece que Apple se resolvió en el lanzamiento final de iOS 9
.
Este es un error en iOS 9 que no pudo recuperar las UIAlertController
supportedInterfaceOrientations
para UIAlertController
. Y parece que se cayó a un bucle de recursión infinita al buscar las UIAlertController
supportedInterfaceOrientations
para UIAlertController
(por ejemplo, rastrea de vuelta a UIAlertControler
-> UIViewController
-> UINavigationController
-> UITabBarController
-> UIAlertController
-> ...), mientras la llamada a UIAlertController:supportedInterfaceOrientations
realidad no está implementado / reemplazado en el código fuente.
En mi solución, acabo de agregar el siguiente fragmento de código:
extension UIAlertController {
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
public override func shouldAutorotate() -> Bool {
return false
}
}
Entonces, UIAlertController
devolverá directamente el valor de orientación soportado sin ciclo infinito. Espero eso ayude.
Editar: Swift 3.0.1
extension UIAlertController {
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.portrait
}
open override var shouldAutorotate: Bool {
return false
}
}
Esto también se puede resolver mostrando siempre el controlador de alerta en una ventana UI recientemente creada. Vea esta respuesta SO sobre cómo crear una categoría que le permita mostrar siempre sus alertas de esta manera.
Mi solución es una categoría Objective-C para UIAlertViewController. Simplemente incluya UIAlertController + supportedInterfaceOrientations.h en cualquier clase que use 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