2013-03-19 7 views

risposta

29

Sfrutta la notifica UITextFieldTextDidChange o imposta un delegato nel campo di testo e osserva textField: shouldChangeCharactersInRange: replacementString.

Se si desidera guardare per le modifiche con una notifica, avrete bisogno di qualcosa di simile nel codice per registrare per la notifica:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField]; 

Ecco theTextField è l'istanza di UITextField che si vuole guardare . La classe di cui sé è un esempio nel codice di cui sopra deve quindi implementare textFieldDidChange, in questo modo:

- (void)textFieldDidChange:(NSNotification *)notification { 
    // Do whatever you like to respond to text changes here. 
} 

Se il campo di testo sta per sopravvivere l'osservatore, allora si deve annullare la registrazione per le notifiche nella dealloc dell'osservatore metodo. In realtà è una buona idea farlo anche se il campo di testo non sopravvive all'osservatore.

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    // Other dealloc work 
} 
+0

Grazie per l'aiuto, ma ho difficoltà con la sintassi. Penso che dovrebbe essere qualcosa di simile - UITextFieldTextDidChange (void): (UITextField *) textField { azione da intraprendere } ma non sembra funzionare – RGriffiths

+0

Per le notifiche è necessario registrare un osservatore per la notifica con NSNotificationCenter . Dai un'occhiata alla documentazione Apple per NSNotificationCenter. Questo è un modello molto comune nello sviluppo di applicazioni iOS e Mac OS X. –

+0

Grazie per il tuo aiuto - ho dato un'occhiata e non vedo cosa devo fare. Scusa - nuovo a tutto questo. – RGriffiths

-3

È possibile aggiungere un membro della classe come questo NSString *changeTemp, quindi

changetemp = textfield; 

if(change temp != textfild){ 
    changetemp=textfild; 
    NSLog(@" text is changed" 
} else { 
    NSLog(@" text isn't changed"): 
} 
1

Si potrebbe creare una variabile per memorizzare la stringa originale, quindi registrare con il centro di notifica per ricevere UITextFieldTextDidChangeNotification evento:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil]; 

Quindi, creare un metodo per ricevere la notifica e confrontare il valore corrente del campo di testo con il valore originale

-(void) updateButton:(NSNotification *)notification { 
     self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString]; 
} 

Non dimenticare di annullare la registrazione della notifica quando il controllore di vista è deallocato.

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil]; 
9

Per questo, in primo luogo è necessario avere il campo di testo lo hanno delegare di riferimento assegnato. E il delgate, dovrebbe preferibilmente essere il controller di vew che è il proprietario dei file della vista. Che va come

myTextField.delegate = myViewControllerReferenceVariable 

E nell'interfaccia viewController, dicono sarete implementando UITextFieldDelegate da

@interface MyViewController:UIViewController<UITextFieldDelegate> 

E nel tuo vista del regolatore di override implementazione

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

Così il codice sarà like

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
     text = [textfield.text stringByReplacingCharactersInRange:range withString:string]; 
     if (textfield == refToTextFieldYouWantToCheck) { 
      if (! [textToCheck isEqualToString:text]) { 
       [theButtonRef setEnabled:YES]; 
      } 
     } 
      return YES; //If you don't your textfield won't get any text in it 
     } 

È inoltre possibile iscriversi alla notifica che è sorta di disordinato IMHO È possibile trovare come farlo here.

+0

Ancora una volta apprezzo molto l'aiuto, ma non è solo vedere se viene inserito del testo? (cioè la lunghezza è ora> 0) C'è del testo già nel campo di testo e voglio rilevare se è cambiato. – RGriffiths

+0

@RichardGriffiths Spiacente, ho pensato che volevi controllare l'esistenza di un contenuto, l'ho corretto ora. Stai cercando di inserire un testo segnaposto? –

+2

Questa è la risposta corretta, non sono sicuro del motivo per cui non è accettata. Questo particolare metodo verrà attivato ogni volta che un nuovo carattere viene inserito o cancellato. Se vuoi solo controllare se la lunghezza del contenuto è maggiore di 0, usa uno degli altri metodi delegate come didBeginEditing, ect – barndog

36

invece di osservare le notifiche o di attuazione textField:shouldChangeCharacterInRange:replacementString:, è più facile per aggiungere solo un target dell'evento:

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

- (void)myTextFieldDidChange:(id)sender { 
    // Handle change. 
} 

Nota che l'evento è UIControlEventEditingChanged e nonUIControlEventValueChanged!

I vantaggi rispetto alle altre due soluzioni proposte sono le seguenti:

  • Non è necessario ricordarsi di annullare la registrazione il controller con la NSNotificationCenter.
  • Il gestore eventi viene chiamato dopo la modifica è stata apportata il che significa che textField.text contiene il testo effettivamente inserito dall'utente. Il metodo delegato textField:shouldChangeCharacterInRange:replacementString: si chiama prima delle le modifiche sono state applicate, quindi textField.text non ti fornisce ancora il testo appena inserito dall'utente - dovresti prima applicare la modifica.
+0

come posso rilevare l'evento della pressione del tasto Backspace in questo metodo "myTextFieldDidChange". Mezzi potresti spiegare 'dovresti applicare il cambiamento prima tu stesso'. parte dalla tua risposta? – ViruMax

+1

@ViruMax: la notifica non è intesa a rilevare la pressione di un singolo tasto. Tuttavia, se si salva il valore del campo di testo in una proprietà che si aggiorna nel gestore di notifica, è possibile confrontare le lunghezze prima di aggiornare la proprietà e quindi sapere se i caratteri sono stati rimossi, sostituiti o aggiunti. Per quanto riguarda "dovresti applicare tu stesso la modifica": vedi [la risposta che si occupa del metodo 'UITextFieldDelegate'] (http://stackoverflow.com/a/15490405/400056) (devi chiamare' stringByReplacingCharactersInRange: withString : 'per ottenere la stringa di risultati del cambiamento). – DarkDust

1

Swift 3,0

Processo 1

Crea IBOutlet di UITextfiled e Aggiungere Target al testo campo.

m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged) 

func textFieldDidChange(textField:UITextField) 
{ 
    NSLog(textField.text!) 
} 

Processo 2

m_lblTxt.delegate = self 

//MARK: - TextField Delegates 
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
{ 
     print(textField.text!) 
     return true 
} 
0

Questo può essere realizzato in Interface Builder sulla Editing Changed caso di UITextField. Trascina da esso sul tuo codice e crea un IBAction.

Ad esempio:

@IBAction func textFieldChanged(_ sender: UITextField) { 
    print(sender.text) 
} 

Questo evento è la stessa descritta in altre risposte qui che la proprietà .text contiene il metodo di scrittura aggiornato quando viene attivato. Ciò può aiutare a ripulire la confusione di codice non dovendo aggiungere l'evento a ogni livello di codice a ogni UITextField nella vista.

Problemi correlati