Alterar programaticamente o tipo de teclado UITextField

175

É possível alterar programaticamente o tipo de teclado de um campo uitext para que algo assim seja possível:

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType: @"Default"];
eric.mitchell
fonte
3
eu sugiro que você mudar o termo doozypara algo que é mais comumente compreensível .. manter em mente SO é um site internacional e não uma norte-americana um
abbood

Respostas:

371

Existe uma keyboardTypepropriedade para 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;

Seu código deve ler

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType:UIKeyboardTypeDefault];
PengOne
fonte
7
Observe que isso não impede que um usuário inteligente / desarranjado insira outros caracteres. Por exemplo: se o teclado Emoji estava ativo antes de tocar no seu campo numérico, ele pode digitar carinhas felizes nele. Não há nada que você possa fazer sobre isso, e é definitivamente o bug da Apple, mas você deve garantir que seu código não falhe se você não inserir números em um campo numérico.
Steven Fisher
Descoberto hoje, isso é propriedade do UITextInputTraitsprotocolo que UITextFieldadota.
rounak
1
É possível alterar programaticamente o tipo de teclado como UIKeyboardTypeNumbersAndPunctuation, para campos de entrada HTML carregados na visualização na web?
Srini
Criei o uitextfield programaticamente em um projeto com o respectivo tipo de teclado. isso é acordado há alguns dias. mas agora isso não está funcionando. Não obtendo motivo real
Rahul Phate
78

É importante notar que, se você deseja que um campo focado no momento atualize o tipo de teclado imediatamente, há uma etapa extra:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

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

Sem a chamada para reloadInputViews, o teclado não será alterado até que o campo selecionado (o primeiro respondedor ) perca e recupere o foco.

Uma lista completa dos UIKeyboardTypevalores pode ser encontrada aqui , ou:

typedef enum : NSInteger {
    UIKeyboardTypeDefault,
    UIKeyboardTypeASCIICapable,
    UIKeyboardTypeNumbersAndPunctuation,
    UIKeyboardTypeURL,
    UIKeyboardTypeNumberPad,
    UIKeyboardTypePhonePad,
    UIKeyboardTypeNamePhonePad,
    UIKeyboardTypeEmailAddress,
    UIKeyboardTypeDecimalPad,
    UIKeyboardTypeTwitter,
    UIKeyboardTypeWebSearch,
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable
} UIKeyboardType;
jterry
fonte
Esta é uma informação útil para saber - eu sugeriria fazer uma pergunta auto-respondida no estilo de perguntas e respostas apenas para extrair as informações sobre a alteração de entrada de campo atualmente focada (era isso que eu estava procurando quando encontrei essa resposta)
Stonz2
1
Também vale mencionar que chamar reloadInputViews no campo de texto que atualmente NÃO está focado não mudará o tipo de teclado imediatamente. Então é melhor chamada [TextField becomeFirstResponder] primeiro e depois [textField reloadInputViews]
Qiulang
1
Era [textField reloadInputViews];isso que estava faltando. Obrigado!
Islam Q.
1
A chamada reloadInputViewstambém funciona para UITextInputimplementações sob medida .
Paul Gardiner
23

Sim, você pode, por exemplo:

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

Isso é rápido. Além disso, para que isso funcione corretamente, ele deve ser definido após otextFieldView.delegate = self

fonz
fonte
7

para fazer com que o campo de texto aceite alfanumérico apenas defina esta propriedade

textField.keyboardType = UIKeyboardTypeNamePhonePad;
Hossam Ghareeb
fonte
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
fonte
5

Swift 4

Se você estiver tentando alterar o tipo de teclado quando uma condição for atendida, siga isto. Por exemplo: Se quisermos alterar o tipo de teclado de Padrão para Teclado numérico quando a contagem do campo de texto for 4 ou 5, faça o seguinte:

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
fonte
2

Há uma propriedade para isso chamada keyboardType. O que você deseja fazer é substituir o local onde você possui as strings @"Number Pade @"Defaultpor UIKeyboardTypeNumberPadeUIKeyboardTypeDefault .

Seu novo código deve ser algo como isto:

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

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

Boa sorte!

Kyle Rosenbluth
fonte
1

para pessoas que desejam usar UIDatePickercomo entrada:

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
fonte
1

Este é o UIKeyboardTypesSwift 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
}

Este é um exemplo para usar um tipo de teclado da lista:

textField.keyboardType = .numberPad
pableiros
fonte
0

Alterar programaticamente o tipo de teclado 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
fonte
0

Aqui está o tipo de teclado no 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
fonte