iOS8 – UIView inputView desaparece después de la aplicación

Tengo este problema solo para iOS8. Todo funciona correctamente en iOS7.

Mi configuration de vista:

  • Tengo una subclass UIView que tiene un inputView personalizado (un keyboard personalizado)
  • La subclass UIView tiene un reconocedor de gesto de toque, lo que lo convierte en el primer respondedor cuando se toca
  • La subclass UIView contiene una subpunta UITextView

Mi procedimiento de testing:

  1. Toque la subclass UIView. Se muestra el keyboard personalizado.
  2. Toque una tecla especial en inputView, que hace que UITextView se convierta en el primer respondedor. Se muestra el keyboard alfa.
  3. Después de escribir text en UITextView, toque la subclass UIView nuevamente para que sea el primero en responder. El keyboard alfa desaparece y el keyboard personalizado vuelve a aparecer.
  4. Haga clic en el button de inicio para salir a la pantalla de inicio. Presiona el ícono de la aplicación para reanudar la aplicación.

El error es que cuando la aplicación se reanuda, el InputView ya no es visible, mientras que fue justo antes del paso # 4. Al tocar en la subclass UIView no vuelve a aparecer. isFirstResponder devuelve true para la subclass UIView si lo verifico después del paso # 4.

¿Alguna idea de cómo evitar que mi inputView desaparezca?

Esto definitivamente es un error de iOS.

inputView publica notifications de keyboard igual que el keyboard normal. En este caso, se UIKeyboardWillHideNotification MainView para MainView de inputView en el primer plano de la aplicación aunque MainView sigue siendo el primer respondedor.

Una solución más limpia a este problema sería registrarse para UIKeyboardWillHideNotification en MainView y restablecer el estado del primerResponedor.

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil) 

Maneje el gatillo con errores.

 func handleKeyboardWillHideNotification(notification:NSNotification) { if (self.isFirstResponder()) { self.resignFirstResponder() self.becomeFirstResponder() } } 

Publicé un proyecto de ejemplo que muestra el error y una solución para ello aquí: https://github.com/jeremywhuff/HWInputViewBugExample

Ejecutalo en iOS8, y verás el error. Ejecutarlo en iOS7, y no lo harás.

Agregué un interruptor "hack fix", que demostrará la corrección. Definitivamente no es ideal, pero es lo mejor que puedo llegar a hacer. Hace que los keyboards parpadeen en el simulador, pero durante las testings del dispositivo, esto no parece suceder.

La corrección del hack se puede encontrar en applicationDidBecomeActive:

 mainView.textView!.becomeFirstResponder() NSTimer.scheduledTimerWithTimeInterval(0.05, target: mainView.textView!, selector: "resignFirstResponder", userInfo: nil, repeats: false) 

Esto hace que la vista de text se convierta y luego renuncie rápidamente al primer respondedor, que parece expulsar al sistema de su modo de input invisible.