web-dev-qa-db-fra.com

Caractères majuscules dans UItextfield

J'ai une question à propos de iOS UIKeyboard.

J'ai un UITextField et je voudrais avoir le keyboard avec uniquement des caractères majuscules.

J'utilise un storyboard et j'ai essayé de définir le Cpitalization comme "All characters" à UITextField properties.

Mais cela ne résoudra pas mon problème ... aucune suggestion?

42
Safari

Définissez le type de champ autocapitalizationType sur UITextAutocapitalizationTypeAllCharacters dans le champ UITextField.

self.yourTexField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;

Après appel délégué

// méthode déléguée

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSRange lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];

    if (lowercaseCharRange.location != NSNotFound) {
        textField.text = [textField.text stringByReplacingCharactersInRange:range
                                                                 withString:[string uppercaseString]];
        return NO;
    }

    return YES;
}
84
codercat

Pour ceux qui recherchent une version Swift:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
     textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string.uppercaseString)

     return false
 }

Je n'ai pas eu de chance avec la modification de la propriété Capitalization: All Characters.

Edit: je voudrais suggérer l’utiliser pour Swift 4

textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
15
Tim S

Un des problèmes que j'ai avec certaines des réponses ci-dessus est que si vous essayez de définir textfield.text, vous perdrez la position du curseur. Ainsi, si un utilisateur tente de modifier le milieu du texte, le curseur sautera à la fin .

Voici ma solution Swift, en utilisant toujours UITextFieldDelegate:

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

    if textField == textFieldToUppercase {
        if string == "" {
            // User presses backspace
            textField.deleteBackward()
        } else {
            // User presses a key or pastes
            textField.insertText(string.uppercaseString)
        }
        // Do not let specified text range to be changed
        return false
    }

    return true
}
14
Dan

La syntaxe est maintenant 

Swift 2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

Swift 3

textField.autocapitalizationType = .allCharacters
12
Eden

Définissez la propriété UITextFieldautocapitalizationType sur UITextAutocapitalizationTypeAllCharacters. Cela fera apparaître tous les caractères en majuscule. Visitez également ici pour en savoir plus sur les champs de texte

4
Adnan Aftab

Version Swift 4.0:

Définissez d’abord le délégué pour le champ de texte que vous souhaitez mettre en majuscule au ViewController actuel (cliquez-glissez du champ de texte vers le currentViewController pour définir le délégué).

Après avoir ajouté l'extension:

extension CurrentViewController: UITextFieldDelegate{

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

        //refference to the textfield you want to target
        if textField.tag == 5{
            textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
            return false
        }
        return true
    }
}
3

C’est une approche différente que j’ai utilisée, où il effectue les actions suivantes:

  1. Applique la capitalisation dès que le caractère est entré 
  2. Attrape les situations où l'utilisateur désactive le verrouillage des majuscules même si le champ de texte est défini sur des majuscules automatiques
  3. Permet une édition facile
  4. Fonctionne avec Swift 2.2

Commencez par enregistrer une notification à mettre à jour chaque fois que des modifications sont apportées dans le champ de texte.

    textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

Ensuite, implémentez textFieldDidChange.

func textFieldDidChange(textField: UITextField) {
    textField.text = textField.text?.uppercaseString
}

J'ai choisi cette option pour éviter une situation dans laquelle l'utilisateur voit une expérience inégale de certains en majuscules, mais a ensuite changé une fois qu'il passe au caractère suivant.

3
CodeBender

La méthode la plus simple consiste à implémenter la méthode modifiée de modification du champ de texte et à définir la valeur de texte du champ de texte sur la représentation en majuscule du texte saisi.

@property (nonatomic, strong) IBOutlet UITextField *yourTextfield

// add target in code or use interface builder
[self.yourTextField addTarget:self 
                       action:@selector(uppercaseTextField)
             forControlEvents:UIControlEventEditingChanged];

- (IBAction)uppercaseTextField:(UITextField*)textField
{
    textField.text = [textField.text uppercaseString];
}
1
Omkar Guhilot

Vous pouvez également utiliser ce code.

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

    // Uppercase for string which you need 
    textField.text = [textField.text stringByReplacingCharactersInRange:range 
                                 withString:[string uppercaseString]];

    // return NO because You have already done it in above code
    return NO;
}
1
Linh Nguyen
/**
 We take full control of the text entered so that lowercase cannot be inserted
 we replace lowercase to uppercase
*/
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // No spaces allowed
    if string == " " {
        return false
    }

    // delete key pressed
    if string == "" {
        textField.deleteBackward()
        return false
    }

    // We only allow alphabet and numbers
    let numbersAndLettersSet = CharacterSet.alphanumerics
    if string.lowercased().rangeOfCharacter(from: numbersAndLettersSet) == nil {
        return false
    }

    // Add the entered text
    textField.insertText(string.uppercased())

    // Return false as we are doing full control
    return false
}
0
Chris

Peut-être qu'il est un peu tard pour une réponse ici, mais comme j'ai une solution qui fonctionne, quelqu'un pourrait trouver cela utile.

Dans la méthode de délégation de champ de texte suivante, vérifiez si la nouvelle chaîne contient des caractères minuscules. Si oui, alors:

  • Ajoute le caractère qui vient d'être saisi au texte du champ de texte.
  • Mettez tout le texte du champ de texte en majuscule.
  • Assurez-vous que false est renvoyé par la méthode.

Sinon, il suffit de renvoyer true et de laisser la méthode fonctionner comme prévu.

Voici sa mise en œuvre:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    var returnValue = true
    let lowercaseRange = string.rangeOfCharacter(from: CharacterSet.lowercaseLetters)
    if let _ = lowercaseRange?.isEmpty {
        returnValue = false
    }

    if !returnValue {
        textField.text = (textField.text! + string).uppercased()
    }

    return returnValue
}

Ce qui précède a parfaitement fonctionné pour moi, et une implémentation similaire fonctionne également pour les vues de texte, après avoir bien sûr effectué les ajustements nécessaires.

J'espère que ça aide!

0
Gabriel T.

Enfin, j'ai trouvé le chemin qui respecte aussi l'édition de texte au milieu de la chaîne dans UITextField

Le problème est que si vous remplacez le texte entier par la propriété UITextFiled.text, le curseur actuel se déplace en fin de texte. Vous devez donc utiliser la méthode .replace() pour spécifier exactement les caractères que vous souhaitez mettre à jour dans upperCase. 

La dernière chose à faire est de renvoyer string.isEmpty comme valeur de retour de la fonction - sinon, vous n'autorisez pas la suppression de texte.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let text = textField.text, let textRange = Range(range, in: text) {
        let uppercasedString = string.uppercased()
        let updatedText = text.replacingCharacters(in: textRange, with: uppercasedString)
        if let selectedTextRange = textField.selectedTextRange {
            textField.replace(selectedTextRange, withText: uppercasedString)
            approveButtonState(vin: updatedText)
        }
        return string.isEmpty
    }
    return false
}
0
Marek Staňa