objective-c ios9 xcode7 uialertcontroller xcode7-beta3

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