Ottenere il valore di un UITextField quando vengono immessi i tasti?


107

Diciamo che ho il seguente codice:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Vorrei greetingLabelleggere "Hello [nameTextField]" non appena l'utente preme un tasto qualsiasi.

Quello di cui ho bisogno fondamentalmente è l'equivalente per iPhone del metodo delegato Cocoa controlTextDidChange.

Il textField:shouldChangeCharactersInRange:metodo delegato viene chiamato ogni volta che si preme un tasto:

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

L'argomento stringa restituisce il carattere premuto. Il textFieldvalore effettivo ( nameTextField.text) rimane tuttavia vuoto.

Cosa mi manca qui? (Vorrei nameTextFieldriflettere la stringa esatta che l'utente ha inserito finora).

Risposte:


197

Si scopre che il modo più semplice per farlo è usare Interface Builder:

  • Aggiungi un'IBAction (al ViewController, ad esempio, come in questo caso)
  • Ctrl-clic (o clic destro) su UITextField in Interface Builder
  • Collega l'evento "Editing Changed" all'IBAction del proprietario del file aggiunto nel primo passaggio.

Funziona a meraviglia :) (Non posso credere di aver passato molti giorni su questo, e di rendermi conto ora che la soluzione era molto più semplice di quanto pensassi: P)


2
Grazie! Ho usato "Value Changed" come faresti con un UISlider, ecc. È interessante che abbiano due eventi che sembrano avere lo stesso comportamento.
wjl

1
Per qualche ragione volevo ancora un modo programmatico per farlo ... ma ho ceduto ... Questo metodo Rocks! Grazie per la condivisione ... l'avevo già visto ma dopo giorni di programmazione il mio cervello non funziona più ehe.
Albert Renshaw

8
@AlbertRenshaw Ma puoi farlo in modo programmatico;) Esegui e basta [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive

101

è possibile registrare un'azione per l'evento UIControlEventEditingChanges nel campo di testo:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

C'è un modo per specificarlo utilizzando Interface Builder?
PlagueHammer

11

UITextFieldha una notifica UITextFieldTextDidChangeche verrà attivata ogni volta che il testo cambia se ti registri. Basta registrarsi per quella notifica e nel metodo chiamato dalla notifica, modificare il testo dell'etichetta.

Per aggiungere a ciò, l'oggetto passato al gestore delle notifiche avrà il testo del file UITextField.

Spero che aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.