Error al agregar vista de entrada a textfield iOS 8

Tengo un problema cuando agrego una vista de entrada personalizada a mi aplicación en iOS 8. Esto funcionaba perfectamente en iOS 7, pero al cambiar a iOS 8 todo falla.

Este es el rastro de la stack:

2014-06-03 21:23:54.237 MyApp[1910:47245] *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller: should have parent view controller: but requested parent is:' *** First throw call stack: ( 0 CoreFoundation 0x00000001042eee35 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000103b919a0 objc_exception_throw + 45 2 CoreFoundation 0x00000001042eed6d +[NSException raise:format:] + 205 3 UIKit 0x00000001023d94cd -[UIViewController _addChildViewController:performHierarchyCheck:notifyWillMove:] + 184 4 UIKit 0x0000000102977a2b -[UIInputWindowController changeToInputViewSet:] + 416 5 UIKit 0x0000000102973f56 -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 185 6 UIKit 0x000000010297826a -[UIInputWindowController setInputViewSet:] + 526 7 UIKit 0x0000000102973c97 -[UIInputWindowController performOperations:withAnimationStyle:] + 50 8 UIKit 0x00000001027559bb -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054 9 UIKit 0x0000000102422afd -[UIResponder becomeFirstResponder] + 468 10 UIKit 0x00000001023235d3 -[UIView(Hierarchy) becomeFirstResponder] + 99 11 UIKit 0x00000001029cdbfb -[UITextField becomeFirstResponder] + 51 12 UIKit 0x0000000102655d61 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 177 lib: terminating with uncaught exception of type NSException (lldb) 

La parte relevante son las primeras líneas. ¿Alguien puede explicar esto? Todo lo que estoy llamando es myTextview.inputView = keyboard ; Keyboard es una UIView creada en el guión gráfico y enlazada a través de IBOutlet.

Me encontré con este problema antes.

Problema :

  • inputView asegurarse de que la vista que asignará a inputView o inputAccessoryView no pertenezca a ninguna vista principal. Cuando crea estas vistas desde un xib dentro de un ViewController, de manera predeterminada se configuran como subvistas de una supervista.

Consejos de solución :

  • Utilice el método removeFromSuperview en la vista que asignará a inputView o inputAccessoryView

Justo antes de becomeFirstResponder elimine la vista que usa para la entrada desde la supervista:

 mTextField.inputView = mInputVeiw; [mInputVeiw removeFromSuperview]; [mTextField becomeFirstResponder]; 

Espero eso ayude.

inputView asegurarse de que la vista que asignará a inputView o inputAccessoryView no pertenezca a ninguna vista principal.

Este error es especialmente molesto ya que cualquier “vista de entrada” creada en un guión gráfico (y por lo tanto, agregada a la view de VC) no se puede configurar como inputView o inputAccessoryView sin causar este locking.

Si la vista de entrada no se agrega a la view de VC, la vista de entrada no estará disponible para la edición visual en el Guión gráfico de Interface Builder. Solo es visible en el panel izquierdo del Guión gráfico.

¿Cómo conectar la barra de herramientas “Simulated Metrics” de Xcode Storyboard a una IBoutlet UIToolbar real?

Preferiría hacer una conexión IB a inputAccessoryView directamente en el Storyboard. Eso causa esta caída. Una solución que encontré es hacer que un IBOutlet secundario esté conectado a la vista en el Guión gráfico, luego en viewDidLoad eliminarlo de la inputAccessoryView y asignarlo inmediatamente a inputAccessoryView . No estoy seguro de si terminaré usando esto.

 - (void)viewDidLoad { // ... [self.keybordView removeFromSuperview]; self.inputAccessoryView = self.keybordView; } 

Me lo imaginé. No estoy seguro de cuál era el problema anteriormente, pero en lugar de vincular un UIView en el constructor de interfaces, en su lugar, creé un UIView progtwigción y funcionó bien.

Sí, la solución Tuyen Nguyen no funcionó para mí. Lo que funcionó para mí en iOS8 / XCode 6 para establecer un inputAccessoryView no fue eliminar FromSuperview PERO para

 [[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**]; 

Espero que esto ayude a alguien.

Encontré la solución que crea el UIView mediante progtwigción (como sugirió Milo), pero se bloquea cuando se usa como @property. En mi caso, necesitaba crear la instancia de UIPickerView en viewDidLoad y asignar a UITextView inputView. Cuando necesito acceder al selector, lo entiendo de esta manera

 UIPickerView *picker = (UIPickerView *)self.myTextField.inputView; 

Mi problema es que he nombrado una vista que tiene un textField ‘inputAccessoryView’ …

 @property (weak, nonatomic) IBOutlet CustomView *inputAccessoryView; 

Error:

 Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller: should have parent view controller: but requested parent is:' 

Solución:

Verifica el nombramiento; no anule si no es necesario.

Tuve el mismo problema cuando traté de configurar mi UIDatePicker en mi UITextField

 - (void)setupViews { ... dobField.inputView = aDatePicker; // Here was the problem ... } 

Mi solución, simplemente “alloc” e “init” mi datePicker en ViewDidLoad

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ... aDatePicker = [[UIDatePicker alloc] init]; // My solution ... } 

Llamar a removeFromSuperView en viewDidLoad no parece funcionar correctamente en modales. Terminé configurando la vista como oculta y luego eliminándola de superView en viewDidAppear .

La mayoría de las respuestas que tenía estaban relacionadas con cambios de código. Descubrí que eliminarlo de la salida de UIView dentro de la vista principal lo arreglaba. https://stackoverflow.com/a/40037236/464313

Mi solución para este problema fue agregar vista a inputView, pero no para agregar view controller a parent.

Tuve el mismo error cuando devuelvo cualquier vista del guión gráfico como inputAccessoryView . Lo arreglé con childViewController. Vea mi respuesta aquí .