Video de YouTube dentro de ViewController modal, extraño crash 'UIViewControllerHierarchyInconsistency'

Tengo un problema con una falla extraña en el iPad 5.0. Este locking solo ocurre en iOS 5.0 y con iPad con un ViewController modal y ese estilo ViewControler configurado en cualquier pantalla pero que funciona bien.

Incluí un ejemplo de código. Si lo ejecuta y presiona el button de la hoja de páginas, aparecerá una window con un UIWebView y un video de Youtube. Una vez que comience el video, presione "pantalla completa" para activar el bugg. (Solo iOS 5, funcionará en iOS 4.x).

Si presiona el button de pantalla completa, la única diferencia será que estoy usando un estilo de pantalla completa para el UIViewController modal y el video se reproduce bien.

¿Alguien sabe un trabajo o una solución mejor?

Terminar la aplicación debido a una exception no detectada "UIViewControllerHierarchyInconsistency" razón: "controller de vista secundario:" UIViewController: 0x85d5e00 "debe tener el controller de vista principal:" NewsTableViewController: 0x855f7b0 ", pero el padre solicitado es:" MPInlineVideoViewController: 0x85d3a20 "

Código fuente (Dropbox) http://db.tt/xqMbeYP1

Esto no es un error en parte de UIWebView.

Lo que sucedió fue que Apple finalmente se volvió estricta en cuanto a la forma en que mantiene la jerarquía de vista de la aplicación. Antes de iOS 5.x, los desarrolladores pudieron eliminar una vista de una jerarquía y agregarla a otra. El ejemplo perfecto de esto sería decir, la jerarquía de la vista principal de la aplicación; cuando se presenta un controller de vista modal, este controller de vista modal tiene su propia jerarquía de vista que no forma parte de la jerarquía de vista de la aplicación; por lo tanto, si el controller de vista modal tenía una subvista y, dentro de esa vista, había dicho una película (que también es una vista) y esta película se maximizaría, la vista de la película se eliminaría de la jerarquía del controller de vista modal y agregado a la jerarquía de vista de la aplicación …

 application modal view controller | | | | window view | | | | |---------------- ------------------ | | | | | | | | subview 1 subview 2 subview 3 movie 

Como puede verse, la jerarquía de vista del controller de vista modal se encuentra fuera de la jerarquía de vista de la aplicación, esto no fue un problema antes de iOS 5.x porque, cuando se presentó el controller de vista modal y se maximizó la película, lo que Apple hizo fue siguiendo:

 application modal view controller | | | | window view | | | | |------------------------- ------------ | | | | | | | | movie subview 1 subview 2 subview 3 

Con la película aparece sobre todas las otras vistas. Este ya no es el caso en iOS 5.x +, es un error hacer eso y se te presentará el error con el que estabas, previamente, recibido.

Para solucionar este problema, debe hacer que la vista del controller de vista modal en la jerarquía de vista de la aplicación no presente el controller de vista como un controller de vista modal y, a continuación, agregue la vista del controller de vista a la jerarquía de la aplicación de la siguiente manera:

  application | | modal view controller window | | | | --------------------------------------------------------------- | | | | | | view subview 1 subview 2 | | ------------------- | | | | subview 3 movie 

Desde este punto en adelante, todos deben pensar, desde el principio, cómo estructurar adecuadamente las jerarquías de visualización y cómo interactuarán entre ellas, así como la futura escalabilidad dentro de esos grandes proyectos.

Este problema fue bien documentado por Apple durante su WWDC 2011. Se discute dentro de la Sesión 102.

Yo tuve el mismo problema. El problema es que el modal no se agrega como un elemento secundario del controller de vista que lo presenta. Parece ser un error de UIKit. Nuestra solución era hacer un falso-modal que se veía idéntico. Tomó algunas horas pero hizo el truco.

Tuve un problema al bloquear la aplicación cuando youtube pasa a pantalla completa.

Resultó que al ingresar al modo de pantalla completa se llama "viewWillDisappear" en el controller de vista de UIWebView donde tenía un código para detener el reproductor, limpiar eliminar algunas vistas de las supervisas, etc.

Lo he resuelto moviendo el código "viewWillDisappear" (apagando YouTube) a "didMoveToParentViewController"

 - (void)didMoveToParentViewController:(UIViewController *)parent { // parent is nil if this view controller was removed if (parent == nil) { [self closeModal]; // this is moved from viewWillDisappear - it is only called when "Back" button of navigationcontroller's item is clicked. } } 

Espero que esto ayude a alguien.