2012-12-19 37 views
14

Ho un UIButton e un UITextField, quando si preme il pulsante la stringa del contenuto del campo di testo sarà uguale a: This is a test string, come posso rilevare che questo testo il campo ha cambiato il suo contenuto in questo caso?che rileva la modifica del contenuto di UITextField quando la modifica non viene effettuata dalla tastiera

p.s. UITextField's metodi delegati non funzionano in questo caso

UPDATE: Desidero che questo comportamento sia su dispositivi iOS 6+.

+0

Se il 'UIButton' è collegato a un' IBAction' che cambia il testo 'UITextField's', il non stai segnalato che questo è successo quando viene chiamato 'IBAction'? – msgambel

+0

su iOS 6 no ... – JAHelia

+0

'IBAction' funziona su ogni' iOS'. Per chiarire, se hai collegato un metodo a 'UIButton' che cambia il testo di' UITextField', allora perché non chiami un altro metodo alla fine del metodo di 'UIButton'? – msgambel

risposta

14

Forse semplice key-value observing funzionerà?

[textField addObserver:self forKeyPath:@"text" options:0 context:nil]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"text"] && object == textField) { 
     // text has changed 
    } 
} 

Edit: Ho appena controllato, e funziona per me.

+0

fantastico ... che l'ha davvero risolto ... il campo di testo ora può rilevare la modifica sul suo testo se il cambiamento è stato fatto a livello di programmazione. grazie mille. – JAHelia

+5

Il problema è che UIKit non è conforme al KVO –

+0

@AlekseyKozhevnikov Funziona per me. – akashivskyy

16

è possibile aggiungere il UITextFieldTextDidChangeNotification: (oggetto param)

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(textFieldChanged:) 
              name:UITextFieldTextDidChangeNotification 
              object:textField]; 

textField è il vostro UITextField. selector è il metodo che verrà chiamato quando è stata attivata questa notifica.

+1

sembra che ci sia un bug in iOS 6, perché non funziona su iOS6 e funziona su iOS 5, aggiornerò la domanda. – JAHelia

+1

Penso che Apple abbia cambiato questo comportamento. In questa domanda (http://stackoverflow.com/questions/12754948/uitextfieldtextdidchangenotification-doesnt-get-called-on-ios6-ipad3) è lo stesso problema. Non l'ho testato su iOS 6. – Sebastian

+1

Questo ha funzionato per me, mentre il metodo UITextFieldDelegate "textField: shouldChangeCharactersInRange: replacementString:" sparava sempre un carattere a corto del contenuto corrente e l'approccio "addTarget: action: forControlEvents:", sia in codice che in IB (Storyboard) l'azione non avrebbe mai sparato! Immagino che questo sia un bug (sono su iOS7.0.2). Per fortuna, l'approccio alla notifica descritto nella risposta di @ Sebastian ha funzionato perfettamente. – idStar

6

È possibile gestire il cambio di testo entro l'evento UIControlEventEditingChanged. Quindi, quando cambi testo programmaticamente, invia questo evento:

textField.text = @"This is a test string"; 
[textField sendActionsForControlEvents:UIControlEventEditingChanged]; 
+2

questo è un trigger manuale dell'evento, in un grande progetto non è pratico inviare l'evento ad ogni cambio di testo. – JAHelia

1

Questa è una soluzione piuttosto robusta, ma dovrebbe funzionare. Nella funzione che viene chiamata quando si preme il pulsante ...

NSString *string = [NSString stringWithFormat:@"This is a test string"]; 
if(string == textfield.text){ 
... 
} 

alternativa, è possibile noi un auto scheduler per controllare se è cambiato più volte.

+4

Non dovrebbe testare NSString o qualsiasi uguaglianza NSObject usando == –

0
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    //You code here... 
} 

Avete provato?

+0

provare a leggere di nuovo la domanda, in questo caso i metodi delegati non funzionano. – JAHelia

+0

Ho provato questo ed è sempre un carattere dietro il contenuto corrente di UITextField (sto facendo questo su iOS7.0.2). – idStar

4

Il metodo delegato potrebbe effettivamente funzionare per voi. Ottieni il campo di testo, l'intervallo che cambierà e la nuova stringa. Puoi metterli insieme per determinare la stringa proposta.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string 
{ 
    NSMutableString *proposed = [NSMutableString stringWithString:textField.text]; 
    [proposed replaceCharactersInRange:range withString:string]; 
    NSLog(@"%@", proposed); 
    // Do stuff. 
    return YES; // Or NO. Whatever. It's your function. 
} 
+0

Questo è un carattere in ritardo. Utilizzare la notifica https://stackoverflow.com/a/13952247/233333 –

1

Ecco una versione Swift3 di risposta di akashivskyy:

func startObservingTextView() { 
    textView.addObserver(self, forKeyPath:"text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil) 
} 

func stopObservingTextView() { 
    textView.removeObserver(self, forKeyPath: "text") 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if let textViewObject = object as? UITextView, textViewObject == textView, keyPath == "text" { 
     // text has changed 
    } 
} 
Problemi correlati