fields ios objective-c cocoa-touch uitextfield first-responder

ios - fields - ¿Por qué es convertido en primerResponder no funciona?



text field ios 11 (2)

AGWindowView un modal usando AGWindowView . Dentro de la vista modal (construida usando IB), hay un campo de texto. El campo de texto ha sido conectado a una toma de corriente.

Esto no funciona:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.placesTextField becomeFirstResponder]; }

La llamada a becomeFirstResponder no funciona y el teclado no aparece.

Esto funciona:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.placesTextField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; }

Sin embargo, si envío un mensaje manualmente usando performSelector:withObject:afterDelay funciona. ¿Por qué no se determina este método hasta el tiempo de ejecución?


Hay una gran diferencia entre su primer y segundo método.

Por el parámetro de delay de performSelector:withObject:afterDelay:

El tiempo mínimo antes de que se envíe el mensaje. La especificación de un retardo de 0 no necesariamente hace que el selector se realice inmediatamente. El selector aún está en cola en el bucle de ejecución del hilo y se realiza tan pronto como sea posible.

El segundo método esperará hasta el momento adecuado y se becomeFirstResponder .


Parece que de alguna manera en iOS7, la vista / objeto aún no está adjunta en la jerarquía / ventana de vista. Entonces, llamar al método sobre el objeto falla. Si ponemos un poco de retraso y está funcionando, eso significa que en ese momento los objetos se adjuntan a la ventana.

Según Apple,

Un objeto respondedor solo se convierte en el primer respondedor si el respondedor actual puede renunciar al estado del primer respondedor (canResignFirstResponder) y el nuevo respondedor puede convertirse en el primer respondedor.

Puede llamar a este método para hacer que un objeto respondedor, como una vista, sea el primer respondedor. Sin embargo, solo debe llamarlo en esa vista si es parte de una jerarquía de vistas. Si la propiedad de ventana de la vista contiene un objeto UIWindow, se ha instalado en una jerarquía de vistas; si devuelve nil, la vista se separa de cualquier jerarquía.

Para más detalles vea la referencia de clase UIResponder .