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?
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;
}
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())
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
}
La syntaxe est maintenant
Swift 2
textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters
Swift 3
textField.autocapitalizationType = .allCharacters
Définissez la propriété UITextField
autocapitalizationType
sur UITextAutocapitalizationTypeAllCharacters
. Cela fera apparaître tous les caractères en majuscule. Visitez également ici pour en savoir plus sur les champs de texte
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
}
}
C’est une approche différente que j’ai utilisée, où il effectue les actions suivantes:
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.
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];
}
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;
}
/**
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
}
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:
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!
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
}