2011-12-13 7 views
8

Estoy escribiendo la validación para mi campo de texto, encontré algo interesante que si puedo verificar cuántos dígitos escribo en el campo de texto en tiempo real. Mi entrada de campo de texto debe ser un número de 8 dígitos. Así que quiero cambiar el texto dentro del campo de texto a color verde cuando llegue a 8 dígitos y cambie el color cuando no sea así.¿Cómo verificar la entrada del campo de texto en tiempo real?

¿Cómo puedo hacer eso? Por favor, ayúdenme, gracias de antemano.

Respuesta

21

Usar -textField:shouldChangeCharactersInRange:replacementString: es probablemente una mala solución porque se dispara antes de que se actualice el campo de texto. Este método probablemente debería usarse cuando desee cambiar el texto del campo de texto antes de que el teclado lo actualice automáticamente. En este caso, es probable que desee usar simplemente el emparejamiento objetivo de la acción durante la edición de los cambios de valor:

[textField addTarget:self action:@selector(checkTextField:) forControlEvents:UIControlEventEditingChanged]; 

Luego, en - (void)checkTextField:(id)sender, intente esto:

UITextField *textField = (UITextField *)sender; 
if ([textField.text length] == 8) { 
    textField.textColor = [UIColor greenColor]; // No cargo-culting please, this color is very ugly... 
} else { 
    textField.textColor = [UIColor blackColor]; 
    /* Must be done in case the user deletes a key after adding 8 digits, 
     or adds a ninth digit */ 
} 
+0

Esta es definitivamente la mejor solución. Tuve el inconveniente de utilizar '-textField: shouldChangeCharactersInRange: replacementString:' –

+0

¡Sí! Recuerde que cuando se llama a ese método, el texto del campo de texto no ha cambiado aún. – aopsfan

+0

¡Solución convenida, mucho mejor que cualquier otra que haya visto! – jcrowson

1

Establecer un delegado para la UITextField y poner en práctica el método – textField:shouldChangeCharactersInRange:replacementString: detalles y ejemplos están en la UITextFieldDelegate Protocol Reference, pero aquí hay un ejemplo rápido:

- (BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string 
{ 
     NSString *text = [textField text]; 
     // NOT BACKSPACE 
     if ([string length] || text.length + string.length < 8) { 
      return YES; 
     } else if (text.length + string.length > 8) { 
      return NO; 
     } else { 
       // DO SOMETHING FOR LENGTH == 8 
       return YES; 
     } 
} 
3

Uso UITextFieldDelegate. especialmente esta función

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

y se puede obtener la muestra enlaces códigos de here ..

+0

La solución aceptada es mejor porque como @aopsfan menciona: 'Usando -textField: shouldChangeCharactersInRange: replacementString: es probablemente una mala solución porque se dispara antes de que el campo de texto se actualice. Por lo tanto, se pierde el requisito de" tiempo real "y las actualizaciones son un personaje detrás (off-by-one). –

2
[textField addTarget:self action:@selector(checkTextField) forControlEvents:UIControlEventEditingChanged]; 

Inténtelo!

4
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

// [textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]]; 
    NSLog(@"%@",searchStr); 
    return YES; 
} 
0

actualización Swift 4.0

txtFieldAdd.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 

Ahora llame a su función. En mi caso, esto habilitará el botón guardar

@objc func textFieldDidChange(_ textField: UITextField) { 
    if (txtFieldAdd.text?.isEmpty)! { 
     btnSave.isEnabled = false 
    } 
    else { 
     btnSave.isEnabled = true 
    } 
} 

Espero que ayude.

Cuestiones relacionadas