Changer le type de clavier UITextField par programme

175

Est-il possible de changer par programme le type de clavier d'un uitextfield afin que quelque chose comme ça soit possible:

if(user is prompted for numeric input only)
    [textField setKeyboardType: @"Number Pad"];

if(user is prompted for alphanumeric input)
    [textField setKeyboardType: @"Default"];
eric.mitchell
la source
3
Je vous suggère de remplacer le terme doozypar quelque chose de plus compréhensible. Gardez à l'esprit que SO est un site international et non nord-américain
abbood

Réponses:

371

Il y a une keyboardTypepropriété pour un UITextField:

typedef enum {
    UIKeyboardTypeDefault,                // Default type for the current input method.
    UIKeyboardTypeASCIICapable,           // Displays a keyboard which can enter ASCII characters, non-ASCII keyboards remain active
    UIKeyboardTypeNumbersAndPunctuation,  // Numbers and assorted punctuation.
    UIKeyboardTypeURL,                    // A type optimized for URL entry (shows . / .com prominently).
    UIKeyboardTypeNumberPad,              // A number pad (0-9). Suitable for PIN entry.
    UIKeyboardTypePhonePad,               // A phone pad (1-9, *, 0, #, with letters under the numbers).
    UIKeyboardTypeNamePhonePad,           // A type optimized for entering a person's name or phone number.
    UIKeyboardTypeEmailAddress,           // A type optimized for multiple email address entry (shows space @ . prominently).
    UIKeyboardTypeDecimalPad,             // A number pad including a decimal point
    UIKeyboardTypeTwitter,                // Optimized for entering Twitter messages (shows # and @)
    UIKeyboardTypeWebSearch,              // Optimized for URL and search term entry (shows space and .)

    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated

} UIKeyboardType;

Votre code doit lire

if(user is prompted for numeric input only)
    [textField setKeyboardType:UIKeyboardTypeNumberPad];

if(user is prompted for alphanumeric input)
    [textField setKeyboardType:UIKeyboardTypeDefault];
PengOne
la source
7
Notez que cela n'empêche pas un utilisateur intelligent / dérangé de saisir d'autres caractères. Par exemple: si le clavier Emoji était actif avant d' appuyer sur le champ de votre numéro, ils sont libres de saisir des smileys. Vous ne pouvez rien faire à ce sujet, et c'est certainement le bogue d'Apple, mais vous devez vous assurer que votre code ne plante pas si vous obtenez des non-nombres dans un champ numérique.
Steven Fisher
Découvert aujourd'hui, c'est une propriété du UITextInputTraitsprotocole, qui UITextFieldadopte.
rounak
1
Est-il possible de changer par programme le type de clavier comme UIKeyboardTypeNumbersAndPunctuation, pour les champs d'entrée HTML chargés dans la vue Web?
Srini
J'ai créé uitextfield par programmation dans un projet avec le type de clavier respectif. cela a été réveillé il y a quelques jours. mais maintenant cela ne fonctionne pas. Ne pas obtenir de raison réelle
Rahul Phate
78

Il convient de noter que si vous souhaitez qu'un champ actuellement ciblé mette à jour immédiatement le type de clavier, il y a une étape supplémentaire:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

[textField setKeyboardType:UIKeyboardTypeEmailAddress];
[textField reloadInputViews];

Sans l'appel à reloadInputViews, le clavier ne changera pas jusqu'à ce que le champ sélectionné (le premier répondeur ) perde et retrouve le focus.

Une liste complète des UIKeyboardTypevaleurs peut être trouvée ici , ou:

typedef enum : NSInteger {
    UIKeyboardTypeDefault,
    UIKeyboardTypeASCIICapable,
    UIKeyboardTypeNumbersAndPunctuation,
    UIKeyboardTypeURL,
    UIKeyboardTypeNumberPad,
    UIKeyboardTypePhonePad,
    UIKeyboardTypeNamePhonePad,
    UIKeyboardTypeEmailAddress,
    UIKeyboardTypeDecimalPad,
    UIKeyboardTypeTwitter,
    UIKeyboardTypeWebSearch,
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable
} UIKeyboardType;
jterry
la source
C'est une information utile à savoir - je suggérerais de faire une question auto-répondue de style Q & A juste pour extraire les informations sur le changement d'entrée de champ actuellement ciblé (c'est ce que je cherchais quand j'ai trouvé cette réponse)
Stonz2
1
Il convient également de mentionner que l'appel de reloadInputViews sur le champ de texte qui n'est actuellement PAS focalisé ne changera pas immédiatement le type de clavier. Il vaut donc mieux appeler [textfield devenirFirstResponder] d'abord puis [textField reloadInputViews]
Qiulang
1
C'était [textField reloadInputViews];que je manquais. Merci!
Islam Q.
1
L'appel reloadInputViewsfonctionne également pour les UITextInputimplémentations sur mesure .
Paul Gardiner
23

Oui, vous pouvez, par exemple:

[textField setKeyboardType:UIKeyboardTypeNumberPad];
Alan Moore
la source
9
    textFieldView.keyboardType = UIKeyboardType.PhonePad

C'est pour rapide. De plus, pour que cela fonctionne correctement, il doit être réglé après letextFieldView.delegate = self

fonz
la source
7

pour que le champ de texte accepte uniquement les caractères alphanumériques, définissez cette propriété

textField.keyboardType = UIKeyboardTypeNamePhonePad;
Hossam Ghareeb
la source
6
_textField .keyboardType = UIKeyboardTypeAlphabet;
_textField .keyboardType = UIKeyboardTypeASCIICapable;
_textField .keyboardType = UIKeyboardTypeDecimalPad;
_textField .keyboardType = UIKeyboardTypeDefault;
_textField .keyboardType = UIKeyboardTypeEmailAddress;
_textField .keyboardType = UIKeyboardTypeNamePhonePad;
_textField .keyboardType = UIKeyboardTypeNumberPad;
_textField .keyboardType = UIKeyboardTypeNumbersAndPunctuation;
_textField .keyboardType = UIKeyboardTypePhonePad;
_textField .keyboardType = UIKeyboardTypeTwitter;
_textField .keyboardType = UIKeyboardTypeURL;
_textField .keyboardType = UIKeyboardTypeWebSearch;
Kishor Kumar Rawat
la source
5

Swift 4

Si vous essayez de changer votre type de clavier lorsqu'une condition est remplie, suivez ceci. Par exemple: si nous voulons changer le type de clavier de Par défaut à Pavé numérique lorsque le nombre du champ de texte est 4 ou 5, procédez comme suit:

textField.addTarget(self, action: #selector(handleTextChange), for: .editingChanged)

@objc func handleTextChange(_ textChange: UITextField) {
 if textField.text?.count == 4 || textField.text?.count == 5 {
   textField.keyboardType = .numberPad
   textField.reloadInputViews() // need to reload the input view for this to work
 } else {
   textField.keyboardType = .default
   textField.reloadInputViews()
 }
Sanket Ray
la source
2

Il y a une propriété pour cela appelée keyboardType. Ce que vous voudrez faire est de remplacer où vous avez des chaînes @"Number Padet @"Defaultpar UIKeyboardTypeNumberPadetUIKeyboardTypeDefault .

Votre nouveau code devrait ressembler à ceci:

if(user is prompted for numeric input only)
    [textField setKeyboardType:UIKeyboardTypeNumberPad];

else if(user is prompted for alphanumeric input)
    [textField setKeyboardType:UIKeyboardTypeDefault];

Bonne chance!

Kyle Rosenbluth
la source
1

pour les personnes qui souhaitent utiliser UIDatePickercomme entrée:

UIDatePicker *timePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 250, 0, 0)];
[timePicker addTarget:self action:@selector(pickerChanged:)
     forControlEvents:UIControlEventValueChanged];
[_textField setInputView:timePicker];

// pickerChanged:
- (void)pickerChanged:(id)sender {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"d/M/Y"];
    _textField.text = [formatter stringFromDate:[sender date]];
}
Brian
la source
1

Voici le UIKeyboardTypespour Swift 3:

public enum UIKeyboardType : Int {

    case `default` // Default type for the current input method.
    case asciiCapable // Displays a keyboard which can enter ASCII characters
    case numbersAndPunctuation // Numbers and assorted punctuation.
    case URL // A type optimized for URL entry (shows . / .com prominently).
    case numberPad // A number pad with locale-appropriate digits (0-9, ۰-۹, ०-९, etc.). Suitable for PIN entry.
    case phonePad // A phone pad (1-9, *, 0, #, with letters under the numbers).
    case namePhonePad // A type optimized for entering a person's name or phone number.
    case emailAddress // A type optimized for multiple email address entry (shows space @ . prominently).

    @available(iOS 4.1, *)
    case decimalPad // A number pad with a decimal point.

    @available(iOS 5.0, *)
    case twitter // A type optimized for twitter text entry (easy access to @ #)

    @available(iOS 7.0, *)
    case webSearch // A default keyboard type with URL-oriented addition (shows space . prominently).

    @available(iOS 10.0, *)
    case asciiCapableNumberPad // A number pad (0-9) that will always be ASCII digits.


    public static var alphabet: UIKeyboardType { get } // Deprecated
}

Voici un exemple d'utilisation d'un type de clavier de la liste:

textField.keyboardType = .numberPad
pableiros
la source
0

Changer par programme le type de clavier UITextField Swift 3.0

lazy var textFieldTF: UITextField = {

    let textField = UITextField()
    textField.placeholder = "Name"
    textField.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    textField.textAlignment = .center
    textField.borderStyle = UITextBorderStyle.roundedRect
    textField.keyboardType = UIKeyboardType.default //keyboard type
    textField.delegate = self
    return textField 
}() 
override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(textFieldTF)
}
Tanjima Kothiya
la source
0

Voici le type de clavier dans Swift 4.2

// UIKeyboardType
//
// Requests that a particular keyboard type be displayed when a text widget
// becomes first responder. 
// Note: Some keyboard/input methods types may not support every variant. 
// In such cases, the input method will make a best effort to find a close 
// match to the requested type (e.g. displaying UIKeyboardTypeNumbersAndPunctuation 
// type if UIKeyboardTypeNumberPad is not supported).
//
public enum UIKeyboardType : Int {


    case `default` // Default type for the current input method.

    case asciiCapable // Displays a keyboard which can enter ASCII characters

    case numbersAndPunctuation // Numbers and assorted punctuation.

    case URL // A type optimized for URL entry (shows . / .com prominently).

    case numberPad // A number pad with locale-appropriate digits (0-9, ۰-۹, ०-९, etc.). Suitable for PIN entry.

    case phonePad // A phone pad (1-9, *, 0, #, with letters under the numbers).

    case namePhonePad // A type optimized for entering a person's name or phone number.

    case emailAddress // A type optimized for multiple email address entry (shows space @ . prominently).

    @available(iOS 4.1, *)
    case decimalPad // A number pad with a decimal point.

    @available(iOS 5.0, *)
    case twitter // A type optimized for twitter text entry (easy access to @ #)

    @available(iOS 7.0, *)
    case webSearch // A default keyboard type with URL-oriented addition (shows space . prominently).

    @available(iOS 10.0, *)
    case asciiCapableNumberPad // A number pad (0-9) that will always be ASCII digits.


    public static var alphabet: UIKeyboardType { get } // Deprecated
}
Rikesh Subedi
la source