Używam poniższego kodu, aby spróbować textField2
zaktualizować zawartość tekstową, aby była zgodna textField1
, gdy użytkownik wpisze textField1
.
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
Jednak wynik, który obserwuję, jest taki, że ...
textField2 to „12”, gdy textField1 to „123”
textField2 to „123”, gdy textField1 to „1234”
... kiedy chcę:
textField2 to „123”, gdy textField1 to „123”
textField2 to „1234”, gdy textField1 to „1234”
Co ja robię źle?
ios
objective-c
uitextfield
user265961
źródło
źródło
Odpowiedzi:
-shouldChangeCharactersInRange
jest wywoływana, zanim pole tekstowe faktycznie zmieni swój tekst, dlatego otrzymujesz starą wartość tekstową. Aby otrzymać tekst po aktualizacji użyj:źródło
[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]
źródło
Szybki 3
W oparciu o zaakceptowaną odpowiedź w Swift 3 powinny działać następujące elementy :
Uwaga
Obie
String
iNSString
mają metody o nazwiereplacingCharacters:inRange:withString
. Jednak, zgodnie z oczekiwaniami, pierwszy oczekuje wystąpieniaRange
, podczas gdy drugi oczekuje wystąpieniaNSRange
. MetodatextField
delegata używaNSRange
wystąpienia, dlategoNSString
w tym przypadku jest to użycie .źródło
replacingCharacters
Powinien byćstringByReplacingCharactersInRange
Zamiast używać UITextFieldDelegate, spróbuj użyć zdarzenia „Editing Changed” UITextField.
źródło
W języku Swift (4), bez
NSString
(czysty jerzyk):Jako rozszerzenie:
źródło
Szybka wersja do tego:
źródło
To jest kod, którego potrzebujesz,
źródło
użyj osłony
źródło
Moje rozwiązanie polega na użyciu
UITextFieldTextDidChangeNotification
.Nie zapomnij zadzwonić
[[NSNotificationCenter defaultCenter] removeObserver:self];
wdealloc
metodzie.źródło
Jeśli chcesz zastąpić tekst pola tekstowego tym, możesz użyć mojego rozwiązania (Swift 3): https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
Po zamianie możesz po prostu
textField.text
pobrać skomponowany tekst.źródło