2013-03-19 13 views

Odpowiedz

29

Skorzystaj z powiadomienia UITextFieldTextDidChange lub ustaw delegata na polu tekstowym i zobacz dla textField: shouldChangeCharactersInRange: replacementString.

Jeśli chcesz obserwować zmiany ze zgłoszeniem, trzeba coś takiego w kodzie do rejestracji zgłoszenia:

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

Tutaj theTextField jest wystąpienie UITextField, które chcesz oglądać . Klasa które samo jest instancją w kodzie powyżej musi wdrożyć textFieldDidChange, tak:

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

Jeśli pole tekstowe ma zamiar przeżyć obserwatora, trzeba wyrejestrować powiadomień w dealloc obserwatora metoda. Właściwie jest to dobry pomysł, nawet jeśli pole tekstowe nie przeżyje obserwatora.

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

Dzięki za pomoc, ale walczę ze składnią. Myślę, że powinno być coś takiego - (void) UITextFieldTextDidChange: (UITextField *) textField { działania podjąć } ale nie wydają się działać – RGriffiths

+0

Do zgłoszeń należy zarejestrować obserwatora do zgłoszenia z NSNotificationCenter . Zapoznaj się z dokumentacją firmy Apple dotyczącą NSNotificationCenter. Jest to bardzo powszechny wzorzec w projektowaniu aplikacji dla systemów iOS i Mac OS X. –

+0

Dzięki za pomoc - obejrzałem i po prostu nie widziałem, co muszę zrobić. Przepraszamy - nowe w tym wszystkim. – RGriffiths

-3

Możesz dodać członka klasy jak ten NSString *changeTemp, następnie

changetemp = textfield; 

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

Można utworzyć zmienną do przechowywania oryginalny łańcuch, a następnie zarejestrować się w centrum powiadamiania otrzymywać UITextFieldTextDidChangeNotification zdarzenie:

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

Następnie utwórz metodę otrzymywania powiadomienia i porównaj bieżącą wartość pola tekstowego z oryginalną wartością

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

Nie zapomnij wyrejestrować powiadomienia, gdy kontroler widoku zostanie zwolniony.

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

W tym celu musisz mieć swoje pole tekstowe z przypisanym poleceniem delegowanym. A DELgate, najlepiej powinien być, kontrolerem vew, który jest właścicielem plików widoku. który jedzie jak

myTextField.delegate = myViewControllerReferenceVariable 

I w interfejsie viewController, powiedz będzie wdrożenie UITextFieldDelegate przez

@interface MyViewController:UIViewController<UITextFieldDelegate> 

A w implementacji ręcznym widok kontrolera

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

Więc kod będzie wyglądać jak

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

Możesz również zasubskrybować powiadomienie, które jest rodzajem bałaganu IMHO Możesz dowiedzieć się jak to zrobić here.

+0

Jeszcze raz bardzo doceniam pomoc, ale czy to nie jest tylko sprawdzanie, czy wprowadzono jakiś tekst? (tzn. długość jest teraz> 0) W polu tekstowym jest już tekst i chcę go wykryć, jeśli zostanie zmieniony. – RGriffiths

+0

@RichardGriffiths Przepraszamy, myślałem, że chcesz sprawdzić istnienie treści, poprawiłem ją teraz. Czy próbujesz umieścić tekst zastępczy? –

+2

To jest poprawna odpowiedź, nie wiem, dlaczego nie jest akceptowana. Ta szczególna metoda będzie wyzwalana za każdym razem, gdy nowy znak zostanie wprowadzony lub usunięty. Jeśli chcesz tylko sprawdzić, czy długość zawartości jest większa od 0, użyj jednej z innych metod delegowania, takich jak didBeginEditing, ect – barndog

36

Zamiast obserwując powiadomienia lub wykonania textField:shouldChangeCharacterInRange:replacementString:, łatwiej jest po prostu dodać cel imprezy:

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

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

Zauważ, że zdarzenie jest UIControlEventEditingChanged i nieUIControlEventValueChanged!

tę przewagę nad innymi dwóch proponowanych rozwiązań są:

  • Nie musisz pamiętać, aby wyrejestrować kontroler z NSNotificationCenter.
  • Procedura obsługi zdarzenia nosi nazwę po zmiana została wprowadzona, co oznacza, że ​​textField.text zawiera tekst, który użytkownik faktycznie wprowadził. Metoda delegatów textField:shouldChangeCharacterInRange:replacementString: nazywa się przed zmianami, więc textField.text nie daje jeszcze tekstu, który właśnie wprowadził użytkownik - najpierw musisz zastosować tę zmianę.
+0

Jak mogę wykryć naciśnięcie klawisza Backspace w tej metodzie "myTextFieldDidChange". Czy możesz wyjaśnić, że "najpierw musisz zastosować tę zmianę". część z twojej odpowiedzi? – ViruMax

+1

@ViruMax: Powiadomienie nie służy do wykrywania naciśnięć jednego przycisku. Jednakże, jeśli zapiszesz wartość pola tekstowego w właściwości, którą aktualizujesz w procedurze powiadamiania, możesz porównać długości przed aktualizacją właściwości, aby wiedzieć, czy znaki zostały usunięte, zastąpione lub dodane. Jeśli chodzi o "sam musisz zastosować zmianę": zobacz [odpowiedź, która dotyczy metody "UITextFieldDelegate"] (http://stackoverflow.com/a/15490405/400056) (musisz wywołać 'stringByReplacingCharactersInRange: withString : 'aby uzyskać wynik zmiany). – DarkDust

1

Swift 3,0

Process 1

Tworzenie IBOutlet z UITextfiled i docelowy Dodaj do pola tekstowego.

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

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

Sposób 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

Można to osiągnąć w interfejsie Konstruktor w przypadku Editing Changed z UITextField. Przeciągnij z niego na swój kod i utwórz IBAction.

Na przykład:

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

To wydarzenie jest taka sama jak opisano w innych odpowiedzi tutaj, że nieruchomość .text zawiera zaktualizowaną wprowadzania tekstu, gdy zostanie uruchomiony. Może to pomóc w usunięciu bałaganu w kodzie, ponieważ nie trzeba go programowo dodawać do każdego widoku w widoku UITextField.