J'utilise le code ci-dessous pour essayer de mettre à jour le contenu textuel de textField2
afin qu'il corresponde à celui de textField1
lorsque l'utilisateur saisit textField1
.
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
Cependant, le résultat que j'observe est que ...
textField2 est "12", lorsque textField1 est "123"
textField2 est "123", lorsque textField1 est "1234"
... quand ce que je veux c'est:
textField2 est "123", lorsque textField1 est "123"
textField2 est "1234", lorsque textField1 est "1234"
Qu'est-ce que je fais mal?
-shouldChangeCharactersInRange
est appelé avant le champ de texte change son texte, c'est pourquoi vous obtenez une ancienne valeur Pour obtenir le texte après la mise à jour, utilisez:
[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",searchStr);
return YES;
}
Sur la base de la réponse acceptée, les éléments suivants devraient fonctionner dans Swift 3 :
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
return true
}
String
et NSString
ont tous deux des méthodes appelées replacingCharacters:inRange:withString
. Cependant, comme prévu, le premier attend une instance de Range
, tandis que le second attend une instance de NSRange
. La méthode déléguée textField
utilise une instance NSRange
, d'où l'utilisation de NSString
dans ce cas.
Au lieu d'utiliser UITextFieldDelegate, essayez d'utiliser "Modification modifiée" event de UITextField.
Dans Swift (4), sans NSString
(Swift pur):
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {
let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)
print("FullString: \(fullString)")
}
return true
}
Version Swift pour cela:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string == " " {
return false
}
let userEnteredString = textField.text
var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
print(newString)
return true
}
C'est le code dont vous avez besoin,
if ([textField isEqual:self.textField1])
textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
utiliser la garde
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard case let textFieldString as NSString = textField.text where
textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
return false
}
return true
}
Ma solution est d'utiliser UITextFieldTextDidChangeNotification
.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];
N'oubliez pas d'appeler [[NSNotificationCenter defaultCenter] removeObserver:self];
dans la méthode dealloc
.
Si vous devez remplacer le texte par ceci, vous pouvez utiliser ma solution (Swift 3): https://Gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
Après le remplacement, vous pouvez simplement obtenir textField.text
pour récupérer le texte composé.