Pregunta

Tengo un UITextField, y cuando el texto se ingresa en ese, quiero obtener el valor doble del campo de texto y realizar algunos cálculos y mostrarlos en un UITableView.

El delegado para UITextField adopta el protocolo UITextFieldDelegate e implementa tanto textFieldShouldReturn: como textFieldDidEndEditing: métodos. textFieldShouldReturn: renuncia al estado del primer respondedor que, según los documentos, también debe activar textFieldDidEndEditing :, pero nunca veo textFieldDidEndEditing: llamado.

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

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

Vale la pena señalar que también intenté conectar algunos de los eventos de campo de texto al delegado y que el evento llame a updateThresholdValue: directamente, pero tampoco funcionó.

¿Fue útil?

Solución 3

Como se menciona en uno de los comentarios, intenté 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 esperaba. Ante eso, comencé a preguntarme un poco.

En algún lugar en todo el google que hice para tratar de obtener una respuesta a este problema, me encontré con un enlace donde una persona tenía un problema con eventos que no se disparaban desde un botón, y resultó que el problema estaba relacionado con la vista en la que se colocó el botón y esa vista que tenía otra subvista como un par del botón, y esa subvista de alguna manera estaba comiendo los eventos en lugar de permitirles ir a donde habían sido dirigidos. 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 todavía.

Anoche decidí volver a crear completamente el archivo plum desde cero (hice una copia de lo que tenía primero), y lo puse a trabajar. La diferencia clave parece ser que en el archivo de plumín original que no funcionaba, había arrastrado un TableViewController desde la paleta y luego había cambiado 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 me conecté todo arriba, todo " simplemente funcionó " ;.

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

Esta tampoco es una respuesta completa porque todavía no entiendo la diferencia entre el TableViewController de la paleta y mi subclase. Cuando descubra eso, actualizaré esta respuesta mediante edición o comentario.

Otros consejos

Acabo de encontrar el mismo problema que describiste. Después de probar todo lo que se me ocurrió, agregué este método de 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 el textFieldShouldEndEditing se dispara y el campo de texto renuncia al primer respondedor.

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

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

Parece que suena como si su campo de texto nunca renunciara como firstResponder. Puede verificarlo con bastante facilidad colocando algunos resultados 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 obligarlo a renunciar primeroResponder.

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

Terminé conectando la edición Modificado para registrar cada cambio en un campo de texto en lugar de descubrir cómo cubrir todos los casos de esquina con las devoluciones de llamada restantes.

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

Si adoptó el protocolo UITextFieldDelegate en su controlador de vista, escriba la siguiente línea de código en el método viewDidLoad para activar los métodos del protocolo anterior en sus campos de texto correspondientes:

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top