2015-04-13 11 views
6

Tworzę aplikację na iPada, aby nauczyć się angielskich słów. Musi sprawdzić dane wejściowe w polu tekstowym, gdy tylko znaki zostaną wpisane w polu tekstowym. Używam funkcji swift shouldChangeCharactersInRange, aby to osiągnąć.Textfield shouldchangecharinesinrange swift

Mój kod:

func textField(textField: UITextField, shouldChangeCharactersInRange range:NSRange, replacementString string: String) -> Bool { 

     if TextField1.text == "apple" { 
      checkImageView1.hidden = false 
     } 
     else { 
      checkImageView1.hidden = true 
     } 

     return true 
    } 

Trzeba pokazać obraz czy słowo jest wpisane w prawo, w tym przypadku „apple”. Problem polega na tym, że gdy użytkownik wpisze "e" z "jabłka", check wyświetli tylko "appl" i nie wyświetli obrazu.

Ktoś wie, jak rozwiązać ten problem?

Odpowiedz

15

Możesz użyć celu na swoim textField ze zdarzeniem kontrolnym EditingChanged zamiast metody delegata.

Swift> = 1,0

myTextField.addTarget(self, action: "didChangeText:", forControlEvents: .EditingChanged) 

Swift 3.0 (string literal selektory są przestarzałe, użyj #selector)

myTextField.addTarget(self, action: #selector(didChangeText(_:)), for: .editingChanged) 

Następnie użyj metody ukierunkowane na uruchamianie kontroli.

func didChangeText(textField:UITextField) { 
    if textField.text == "apple" { 
     checkImageView1.hidden = false 
    } else { 
     checkImageView1.hidden = true 
    } 
} 
+0

Dlaczego to nie jest możliwe do połączenia w IB Nigdy nie dowiem się. –

+0

Działa to lepiej niż metoda delegata! doskonały!! – user3069232

+0

W Swift 3.0 występuje niewielka zmiana składni w następujący sposób. myTextField.addTarget (self, action: #selector (didChangeText (textField :)), dla: .editingChanged) – woogii

2

Zamiast stosowania metody delegata, przypiąć metodę do zdarzenia „Montaż Value Changed” i zaakceptować textField jako nadawcy.

W metodzie viewDidLoad:

textField.addTarget(self, action: "textFieldEdited:", forControlEvents: UIControlEvents.EditingChanged) 

Jest to metoda, która zostanie aktywowany

func textFieldEdited(sender: UITextField) 
{ 
    var text = sender.text 
} 
2

użyć następującego kodu. Ta funkcja pobiera nową wartość ciągu dodawaną w zmiennej string. Jeśli połączysz go z textField1.text, otrzymasz pełny ciąg w textField.

func textField(textField: UITextField, shouldChangeCharactersInRange range:NSRange, replacementString string: String) -> Bool { 

     var startString = "" + TextField1.text+string  //Now this should be 'Apple' 
     return true 
    } 
+0

To nie zadziała, jeśli użyjesz Backspace lub jakiejś innej manipulacji tekstem. – dchakarov

3

Chociaż odpowiedź Węzły jest poprawna, dlatego to tylko widząc „angie” zamiast „jabłko” jest fakt, że tekst textField nie jest na bieżąco z najnowszymi wpisu w tym punkcie, jak nazwa metoda delegata określa shouldChangeCharactersInRange. Zamiast sprawdzać tekst textField należy wykonać wymianę nowego wpisu i sprawdzić nową wartość coś jak poniżej:

Swift 3

let newText = textField.text?.replacingCharacters(in: range, with: string) 

Korzystanie zdarzenie EditingChanged będzie działać, jeśli po prostu chcesz uzyskać najnowszą wartość, ale jeśli chcesz wykonać jakąś walidację każdego wpisu przed zmianą tekstu, musisz przejść do metody delegowania.

+1

'textField.text' zwraca' String' oraz 'replaceingCharacters in: with:' potrzebuje 'NSString'. Powinieneś więc zrobić coś takiego: 'let newText = (textField.text as! NSString) .replacingCharacters (in: range, with: string)' – chengsam

2

Swift 3 jako chengsam prawidłowo wymienić: replacingCharacters in: with: potrzebuje NSString. Musisz więc zrobić coś takiego:

let newText = NSString(string: textField.text!).replacingCharacters(in: range, with: string) 
Powiązane problemy