2012-12-19 5 views
14

Mam UIButton i UITextField, po naciśnięciu przycisku łańcuch zawartości pola tekstowego będzie równy: This is a test string, jak wykryć, że ten tekst pole zmieniło swoją zawartość w tym przypadku?wykrywanie zmiany zawartości UITextField, gdy zmiana nie jest dokonywana za pomocą klawiatury

p.s. UITextField's Metody delegatów nie działają w takim przypadku:

AKTUALIZACJA: Chcę, aby to zachowanie było na urządzeniach z systemem iOS 6+.

+0

Jeśli 'UIButton' jest podłączona do' IBAction' który zmienia tekst UITextField's' 'The nie jesteś poinformowany, że stało się tak, gdy zadzwonił "IBAction"? – msgambel

+0

na iOS 6 nr ... – JAHelia

+0

'Praca IBAction' w każdym" iOS ". Aby wyjaśnić, jeśli podłączyłeś metodę 'UIButton', która zmienia tekst' UITextField', to dlaczego po prostu nie wywołasz innej metody na końcu metody 'UIButton'? – msgambel

Odpowiedz

14

Może prosty key-value observing będzie działać?

[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: Właśnie sprawdziłem to i to działa na mnie.

+0

niesamowite ... to naprawdę rozwiązało ... pole tekstowe może teraz wykryć zmianę w tekście, jeśli zmiana została wykonana programowo. Dziękuję bardzo. – JAHelia

+5

Problem polega na tym, że UIKit nie jest zgodny z KVO –

+0

@AlekseyKozhevnikov To działa dla mnie. – akashivskyy

16

Możesz dodać UITextFieldTextDidChangeNotification:

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

textField (Object param) to UITextField. selector to Twoja metoda, która zostanie wywołana po uruchomieniu powiadomienia.

+1

brzmi, że jest błąd w iOS 6, ponieważ nie działa on na iOS6 i działa na iOS 5, zaktualizuję to pytanie. – JAHelia

+1

Myślę, że Apple zmienił to zachowanie. W tym pytaniu (http://stackoverflow.com/questions/12754948/uitextfieldtextdidchangenotification-doesnt-get-called-on-ios6-ipad3) jest to ten sam problem. Nie testowałem tego w systemie iOS 6. – Sebastian

+1

To działało dla mnie, podczas gdy metoda UITextFieldDelegate 'textField: shouldChangeCharactersInRange: replacementString:' zawsze uruchamiałaby znak o jeden znak niż aktualna zawartość i podejście 'addTarget: action: forControlEvents:', czy to w kodzie, czy w IB (Storyboard) czy akcja nigdy nie wybuchnie! Wyobrażam sobie, że to błąd (jestem na iOS7.0.2). Na szczęście metoda powiadomień opisana w odpowiedzi @ Sebastiana działała idealnie. – idStar

6

Możesz obsłużyć zmianę tekstu w ramach wydarzenia UIControlEventEditingChanged. Więc kiedy zmieniasz tekst programowo, po prostu wyślij to wydarzenie:

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

to ręczne wyzwalanie zdarzenia, w dużym projekcie nie jest praktyczne wysyłanie zdarzenia z każdą zmianą tekstu. – JAHelia

1

To dość solidne rozwiązanie, ale powinno działać. W funkcji, która jest wywoływana po naciśnięciu przycisku ...

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

Lub możesz nam samouzdrawiacz, aby sprawdzić, czy wielokrotnie się zmienia.

+4

Nie należy testować NSString ani żadnej równości NSObject, używając == –

0

Czy próbowałeś tego?

+0

postaraj się ponownie przeczytać pytanie, metody delegatów nie działają w tym przypadku. – JAHelia

+0

Próbowałem tego i zawsze jest jeden znak za bieżącą zawartością UITextField (robię to na iOS7.0.2). – idStar

4

Metoda delegatów może faktycznie działać dla Ciebie. Otrzymasz pole tekstowe, zakres, który się zmieni i nowy ciąg. Możesz je połączyć, aby określić proponowany ciąg.

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

Jest to jeden znak spóźniony.Zawierające powiadomienie https://stackoverflow.com/a/13952247/233333 –

1

Oto wersja Swift3 odpowiedzi akashivskyy za:

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 
    } 
} 
Powiązane problemy