UIImagePickerController & view no está en la jerarquía de windows

Tengo un proyecto Swift simple en el que:

ViewController A ( class ViewController: UIViewController ) presenta ViewController B – ( class WebViewController: UIViewController, WKNavigationDelegate, CLLocationManagerDelegate, WKScriptMessageHandler ).

ViewController B es esencialmente solo un WKWebView, aquí está su viewDidLoad() :

 let contentController = WKUserContentController(); contentController.addScriptMessageHandler( self, name: "eventHandler" ) let config = WKWebViewConfiguration() config.userContentController = contentController webView = WKWebView(frame: CGRectZero, configuration: config) webView.navigationDelegate = self webView.allowsBackForwardNavigationGestures = false view = webView 

Entonces, cuando se muestra ViewController B, básicamente tengo un browser web en toda la pantalla.

El problema con el que me estoy topando es que, si el Usuario (mientras está en una página web) hace clic en "Cargar files / Selector de files", primero veo esto:

Pasó en type public.item no se ajusta a public.content o public.data. Si está exportando un nuevo tipo, asegúrese de que cumpla con un tipo de padre apropiado. el comportamiento de UICollectionViewFlowLayout no está definido porque el ancho del elemento debe ser menor que el ancho del UICollectionView less la sección inserta valores de izquierda y derecha, less los valores de inserciones de izquierda y derecha.

La instancia relevante de UICollectionViewFlowLayout es <_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>, y está adjunta a; animaciones = {bounds.origin =; bounds.size =; position =; }; capa =; contentOffset: {0, 0}; contentSize: {0, 0}> layout de vista de colección: <_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>.

Entonces, si el Usuario elige "Tomar foto o video" o "Fototeca" en la list de opciones de iOS, obtengo esto:

Advertencia: intente presentar UIImagePickerController: 0x12d192200 en My.WebViewController: 0x12e2883e0 cuya vista no está en la jerarquía de windows.

El resultado es que:

  1. El selector de la biblioteca de fotos // la aplicación de la camera nunca aparece.
  2. ViewController B sufre un despido animado, por alguna razón.

¿Alguien tiene alguna sugerencia? Traté de proporcionar el código relevante, pero puedo pegar más si es necesario. Gracias.

– ACTUALIZACIÓN ——–

Está bien, entonces después de más investigaciones, en realidad hay dos cosas por hacer:

  1. El primer error es una function de cómo el "selector de files" es manejado por un browser mobile. Mira aquí … gran esquema de cosas, no es un gran problema.

  2. El segundo error Attempt to present UIImagePickerController... – el más debilitante de los dos – es más feo.

Si un ViewController con un WKWebView se presenta desde otro ViewController entonces, cuando el usuario intenta "seleccionar" una image (de la biblioteca o la camera), iOS intentará presentar el UIImagePicker desde su WKWebView ViewController, que es lo que desea.

Desafortunadamente, por una razón que todavía no sé, el hecho de que el Usuario trate de "seleccionar" una image también hace que iOS rechace el controller de vista presentado … que, en este caso, es su controller WKWebView 🙁 Como tal , el WKWebView ViewController descarta, por lo que no está en la jerarquía de windows cuando intenta presentar el UIImagePicker, por lo tanto, el error.

Mi solución (que es bastante hacky, pero funciona para mi caso de uso particular), es la siguiente; Espero que esto ayude a alguien:

  1. Instale WKWebView ViewController ( ViewController B )
  2. Establezca VC B como controller de vista raíz de la aplicación
  3. Presente VC B desde ViewController A
  4. Descartar VC A

Esto básicamente hace que no se pueda descartar el WKWebView, evitando el problema.

 let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("Browser") as! WebViewController UIApplication.shanetworkingApplication().keyWindow?.rootViewController = vc self.presentViewController(vc, animated: false, completion: { () -> Void in self.dismissViewControllerAnimated(false, completion: nil) }) 

    Si está haciendo int en la function viewDidLoad(){} actualmente, intente mover el código a override viewDidAppear(animated: Bool) {} Hoy tuve el mismo problema y lo solucionó.