web-dev-qa-db-fra.com

Avec `textField: shouldChangeCharactersInRange:`, comment puis-je obtenir le texte comprenant le caractère saisi?

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?

106
user265961

-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]];
265
Vladimir
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
    return YES;
}
50
btmanikandan

Swift 3

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
}

Remarque

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.

29
focorner

Au lieu d'utiliser UITextFieldDelegate, essayez d'utiliser "Modification modifiée" event de UITextField.

22
tomute

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
}
8
bauerMusic

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

C'est le code dont vous avez besoin,

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
5
Deepak Danduprolu

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
    }
1
ober

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.

0
Bogdan Weidmann

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é.

0
blackjacx