2009-08-04 11 views
11

Estoy jugando con la escritura de mi primera aplicación para iPhone; SDK 3.0. Tengo un UITextField, y cuando se ingresa texto, quiero obtener doubleValue del campo de texto y realizar algunos cálculos y mostrarlos en una UITableView.¿por qué textFieldDidEndEditing: no se llama?

El delegado para UITextField adopta el protocolo UITextFieldDelegate e implementa los métodos textFieldShouldReturn: y textFieldDidEndEditing: text. textFieldShouldReturn: renuncia al estado de la primera respuesta que, de acuerdo con los documentos, también debería desencadenar textFieldDidEndEditing :, pero nunca veo textFieldDidEndEditing: called.

- (BOOL)textFieldShouldReturn:(UITextField*)theTextField { 
    if (theTextField == thresholdValue) { 
     [thresholdValue resignFirstResponder]; 
    } 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [self updateThresholdValue:textField]; 
} 

Puede valer la pena señalar que también he intentado conectar algunos de los eventos TextField para el delegado y tener la llamada updateThresholdValue evento: directamente, pero que no funcionó bien.

+0

Ponga algunos NSLogs para asegurarse de que el método nunca se llame. – mk12

+0

Has hecho myTextField.delegate = self en alguna parte, ¿verdad? – mk12

+2

Supongo que tiene su delegado conectado correctamente; de ​​lo contrario, textFieldShouldReturn: tampoco se llamaría. –

Respuesta

1

Como mencioné en uno de los comentarios, traté de replicar una versión más simple de lo que estaba tratando de hacer usando una aplicación HelloWorld, y funcionó en el primer intento, sin problemas, tal como se esperaba. Enfrentado con eso, comencé a preguntarme un poco.

En algún lugar de toda la búsqueda de Google que hice para tratar de dar una respuesta a este problema, encontré un enlace donde una persona tenía un problema con eventos que no se activaban desde un botón, y resultó que el problema estaba relacionado a la vista en la que se colocó el botón y esa vista que tiene otra subvista como igual al botón, y esa subvista de alguna manera estaba comiendo los eventos en lugar de permitirles ir a donde los habían dirigido. El escenario no era exactamente el mismo que el mío, pero sonaba lo suficientemente cerca como para que la investigación valiera la pena. A pesar de todos los excelentes consejos recibidos aquí, ninguno había dado frutos.

Anoche decidí volver a crear por completo el archivo de punta desde cero (hice una copia de lo que tenía primero), y lo hice funcionar. La diferencia clave parece ser que, en el archivo de punta no funcional original, arrastré un TableViewController desde la paleta, luego cambié su tipo a mi subclase PZTableViewController. Cuando hice lo mismo en mi nueva punta, los eventos no se dispararon. Si, por otro lado, eliminé el TableViewController arrastrado y en su lugar simplemente arrastré sobre un NSObject y cambié su clase a PZTableViewController y lo conecté todo, todo "simplemente funcionó".

Intentaré buscar el enlace que me ayudó a comenzar con esta línea de pensamiento y publicarlo como una edición o como un comentario.

Esto tampoco es una respuesta completa porque aún no entiendo la diferencia entre la paleta TableViewController y mi subclase. Cuando lo descubra, actualizaré esta respuesta mediante edición o comentario.

5

textFieldDidEndEditing se activa cuando el campo de texto renuncia a su estado de primera respuesta mientras textFieldShouldReturn se activa cuando se presiona el botón de retorno.

Es suena como su campo de texto nunca está renunciando como firstResponder. Puede verificarlo fácilmente colocando algún resultado de depuración (como se sugiere en los comentarios) y simplemente navegando fuera del campo de texto con un toque - por ejemplo, comience a escribir y luego toque fuera del campo para forzarlo a renunciar primero.

No estoy seguro si eso ayuda mucho, pero suena como un caso extraño al que está golpeando.

+0

Gracias por la nota. Eche un vistazo al código que agregué a la pregunta inicial. testFieldShouldReturn: llama a resignFirstResponder, y he confirmado que la línea de dimisión de código se ejecuta a través del depurador. ¿TextFieldDidEndEditing: se llama como parte de la ejecución de resignFirstResponder, o se produce * después de * resignFirstResponder completa la ejecución? Finalmente, en caso de que importe, todavía estoy corriendo en el simulador en lugar del dispositivo real. Aún no tengo las llaves mágicas. –

+0

Más información sobre esto ... Saqué la aplicación de demostración HelloWorld - tengo un campo de texto, un botón y una etiqueta: escriba texto en el campo, pulse el botón, actualice las etiquetas. Modifiqué la punta para que la etiqueta envíe un evento de "Edición finalizada" al mismo objeto y acción que usa el botón. Y funcionó. Entonces, volví a mi aplicación descrita anteriormente e hice lo mismo ... y no funcionó. Debe haber algo sutilmente diferente, pero hasta ahora no lo he visto. –

+0

Otra cosa que comprobaría es que la firma de método para textFieldDidEndEditing * exactamente * coincide con la firma de los documentos de API, me parece correcta, pero si hay algún error en que el método de delegado nunca se invoque. En realidad, puede copiar la firma directamente de los documentos API para estar seguro. – paulthenerd

6

Acabo de encontrar el mismo problema que usted describió.Después de probar todo lo que podía pensar que este método añadió delegado:

// if we encounter a newline character return 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    // enter closes the keyboard 
    if ([string isEqualToString:@"\n"]) 
    { 
     [textField resignFirstResponder]; 
     return NO; 
    } 
    return YES; 
} 

Ahora los fuegos textFieldShouldEndEditing y el campo de texto renuncia de primera respuesta.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

ahora considere el caso cuando tiene dos UITextFields en el mismo VC. ¿Es una buena idea renunciar al kbd al ingresar? –

1

que terminaron el cableado hasta editingChanged para registrar cada cambio en un campo de texto en lugar de encontrar la manera de cubrir todos los casos de esquina con las devoluciones de llamada restantes.

Muy "eficiente" debido a la "usabilidad" similar a Android de textFieldDidEndEditing (sarcasmo).

Cuestiones relacionadas