2011-12-13 16 views
8

Sto scrivendo la convalida per il mio campo di testo, ho trovato qualcosa di interessante che sia possibile verificare quante cifre sto digitando nel campo di testo in tempo reale. Il mio input di campo di testo deve essere un numero di 8 cifre. Quindi voglio cambiare il testo all'interno del campo di testo in verde quando raggiungo 8 cifre e cambio colore quando non lo è.Come verificare l'immissione del campo di testo in tempo reale?

Come posso farlo? Per favore aiutami, grazie in anticipo.

risposta

21

L'utilizzo di -textField:shouldChangeCharactersInRange:replacementString: è probabilmente una soluzione non valida perché si attiva prima che il campo di testo venga aggiornato. Questo metodo dovrebbe probabilmente essere utilizzato quando si desidera modificare il testo del campo di testo prima che la tastiera lo aggiorni automaticamente. Qui, probabilmente si desidera utilizzare semplicemente target-azione accoppiamento durante la modifica di valore cambia:

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

Poi, nel - (void)checkTextField:(id)sender, provate questo:

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

Questa è sicuramente la soluzione migliore. Ho avuto il problema "fuori fase" usando '-textField: shouldChangeCharactersInRange: replacementString:' –

+0

Sì! Ricorda che quando viene chiamato quel metodo, il testo del campo di testo non è ancora cambiato. – aopsfan

+0

Concordato, soluzione molto migliore di qualsiasi altra che ho visto! – jcrowson

1

Impostare un delegato per la UITextField e implementare il metodo – textField:shouldChangeCharactersInRange:replacementString: dettagli ed esempi sono nel UITextFieldDelegate Protocol Reference, ma ecco un esempio veloce:

- (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

Usa UITextFieldDelegate. in particolare questa funzione

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

e si può ottenere codici di esempio collegamenti da here ..

+0

La soluzione accettata è meglio perché come @aopsfan menzioni: 'Utilizzando -textField: shouldChangeCharactersInRange: ReplacementString: è probabilmente una cattiva soluzione, perché spara prima che il campo di testo updates.' Così, si perde il requisito di "real-time" e gli aggiornamenti sono un personaggio dietro (off-by-one). –

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

Provalo!

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

Aggiornamento Swift 4.0

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

Ora chiama la tua funzione. Nel mio caso, questo permetterà il pulsante

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

Speranza che aiuta a risparmiare.

Problemi correlati