'NSInvalidArgumentException', motivo: 'La hoja no se puede presentar porque la vista no está en una window

Después de actualizar Xcode de la Versión 4 a 5 y, por lo tanto, de iOS 6 a iOS 7 obtuve el siguiente error:

'NSInvalidArgumentException', motivo: 'La hoja no se puede presentar porque la vista no está en una window

en esta línea:

[actionSheet showInView:self.view]; 

Literalmente, tuve este mismo problema y desafortunadamente todavía no estoy seguro de cuál es la causa raíz del problema. Sin embargo, a continuación encontrará mi solución actual. Si hago algún progreso en la raíz causando el problema, te lo haré saber.

 UIWindow* window = [[[UIApplication shanetworkingApplication] delegate] window]; if ([window.subviews containsObject:self.view]) { [emailSheet showInView:self.view]; } else { [emailSheet showInView:window]; } 

Tengo el mismo problema. En mi código, obviamente, la razón era que quería mostrar una hoja de acción en viewWillAppear: Después de mover el código a viewDidAppear: el error desapareció.

No sé cuál es la causa raíz del problema, pero encontré una solución que está funcionando para mí. En lugar de self.view , coloque esta línea:

 [[[[UIApplication shanetworkingApplication] keyWindow] subviews] lastObject] 

por ejemplo:

 [actionSheet showInView:[[[[UIApplication shanetworkingApplication] keyWindow] subviews] lastObject]]; 

Tuve el mismo problema y, en mi caso, esto sucedió cuando traté de mostrar una Hoja de Acción en mi propia vista mientras mi propia vista presentaba otra vista Controlador.

Este es el locking: "La hoja no se puede presentar porque la vista no está en una window"

ejemplo para el problema:

 [modalViewController dismissModalViewControllerAnimated:YES]; [actionSheet showInView:self.view]; 

Resolví el problema esperando que el modalViewController se desconecte y luego muestre el ActionSheet.

Solución:

 [modalViewController dismissModalViewControllerAnimated:YES]; [actionSheet performSelector:@selector(showInView:) withObject:self.view afterDelay:0.6]; 

Espero que esto ayude a mucha gente 🙂

Tuve el mismo problema [actionSheet showInView:self.view]; y lo resolví con [actionSheet showInView:[UIApplication shanetworkingApplication].keyWindow]; .

Quizás el problema esté relacionado con el párrafo de la documentation de Apple :

Notas de subclasss:

UIActionSheet no está diseñado para ser subclasificado, ni debe agregar vistas a su jerarquía. Si necesita presentar una hoja con más personalización que la proporcionada por la API de UIActionSheet, puede crear la suya y presentarla de manera modal con presentViewController:animated:completion:

En mi caso, esto sucede cuando un controller de vista que acaba de ser empujado a la stack decide que quiere mostrar una hoja de alerta. Pero, al parecer, el controller de visión aún no está completamente preparado para hacerlo justo después de que se empuja. Yo uso [actionSheet showInView:self.parentViewController.view]; en lugar de [actionSheet showInView:self.view]; .

Tuve un problema similar con una barra de herramientas y debería ser mejor siempre verificar si la vista pasada al selector showInView tiene una window no nula. Por ejemplo:

 if (self.view.window) [actionSheet showInView:self.view]; 

De esta forma, podemos evitar excepciones molestas. Luego, de acuerdo con el layout de su aplicación, debe search una vista válida para mostrar la hoja de acción. Si su aplicación tiene una barra de tabs o una barra de herramientas, debería ser mejor usarla.

 - (void)showFromToolbar:(UIToolbar *)view; - (void)showFromTabBar:(UITabBar *)view; 

He usado previamente

 - (void)showFromTabBar:(UITabBar *)view; 

y golpeé un problema similar con uno de mis controlleres (tengo un método de utilidad que se encarga de mostrar hojas de acción de varios controlleres) a medida que se establece

 hidesBottomBarWhenPushed = YES; 

Con iOS 7 esto ahora parece establecer la window a cero en la tabBar que causa el error mencionado. Mi solución es comprobar la propiedad de la window de tabBar y, si no es necesario, llamar

 if (nil == tabBar.window) { [actionSheet showInView:self.window]; } else { [actionSheet showFromTabBar:tabBar]; } 

En iOS 7, la vista enviar a showInView: debería ser la parte de la jerarquía de la vista. Se debe agregar como la subvista de alguna vista.
Puede verificar si alguna vista se puede usar en showInView: verificando si view.window es nula o no.
view.superview también debe ser no-nil