Ändern Sie programmgesteuert den UITextField-Tastaturtyp

175

Ist es möglich, den Tastaturtyp eines Uitextfelds programmgesteuert so zu ändern, dass so etwas möglich ist:

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType: @"Default"];
eric.mitchell
quelle
3
Ich würde vorschlagen, dass Sie den Begriff doozyin etwas ändern , das allgemein verständlicher ist. Denken Sie daran, SO ist eine internationale Site und keine nordamerikanische
Abbood

Antworten:

371

Es gibt eine keyboardTypeEigenschaft für 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;

Ihr Code sollte lauten

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType:UIKeyboardTypeDefault];
PengOne
quelle
7
Beachten Sie, dass dies einen cleveren / gestörten Benutzer nicht daran hindert, andere Zeichen einzugeben. Beispiel: Wenn die Emoji-Tastatur aktiv war, bevor sie auf Ihr Nummernfeld getippt hat, können sie Smileys eingeben. Sie können nichts dagegen tun, und es ist definitiv Apples Fehler, aber Sie sollten sicherstellen, dass Ihr Code nicht abstürzt, wenn Sie in einem Zahlenfeld keine Zahlen erhalten.
Steven Fisher
Heute herausgefunden, ist dies eine Eigenschaft des UITextInputTraitsProtokolls, das UITextFieldübernimmt.
Rounak
1
Ist es möglich, den Tastaturtyp programmgesteuert als UIKeyboardTypeNumbersAndPunctuation für in die Webansicht geladene HTML-Eingabefelder zu ändern?
Srini
Ich habe uitextfield programmgesteuert in einem Projekt mit dem jeweiligen Tastaturtyp erstellt. Dies ist vor ein paar Tagen geweckt. aber jetzt funktioniert das nicht. Kein wirklicher Grund
Rahul Phate
78

Wenn Sie möchten, dass ein aktuell fokussiertes Feld den Tastaturtyp sofort aktualisiert, gibt es einen zusätzlichen Schritt:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

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

Ohne den Aufruf von reloadInputViewsändert sich die Tastatur erst, wenn das ausgewählte Feld (der Ersthelfer ) den Fokus verliert und wieder gewinnt.

Eine vollständige Liste der UIKeyboardTypeWerte finden Sie hier oder:

typedef enum : NSInteger {
    UIKeyboardTypeDefault,
    UIKeyboardTypeASCIICapable,
    UIKeyboardTypeNumbersAndPunctuation,
    UIKeyboardTypeURL,
    UIKeyboardTypeNumberPad,
    UIKeyboardTypePhonePad,
    UIKeyboardTypeNamePhonePad,
    UIKeyboardTypeEmailAddress,
    UIKeyboardTypeDecimalPad,
    UIKeyboardTypeTwitter,
    UIKeyboardTypeWebSearch,
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable
} UIKeyboardType;
jterry
quelle
Dies sind nützliche Informationen, die Sie wissen sollten. Ich würde vorschlagen, eine selbst beantwortete Frage im Q & A-Stil zu stellen, um die Informationen über die derzeit fokussierte Änderung der
Feldeingabe
1
Es ist auch erwähnenswert, dass das Aufrufen von reloadInputViews in dem Textfeld, das derzeit NICHT fokussiert ist, den Tastaturtyp nicht sofort ändert. Rufen Sie also besser zuerst [textfield comeFirstResponder] auf, dann [textField reloadInputViews]
Qiulang,
1
Es war, [textField reloadInputViews];dass ich vermisst wurde. Vielen Dank!
Islam Q.
1
Das Aufrufen reloadInputViewsfunktioniert auch für maßgeschneiderte UITextInputImplementierungen.
Paul Gardiner
23

Ja, Sie können zum Beispiel:

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

Dies ist für schnelle. Damit dies richtig funktioniert, muss es auch nach dem eingestellt werdentextFieldView.delegate = self

fonz
quelle
7

Damit das Textfeld alphanumerisch akzeptiert, legen Sie nur diese Eigenschaft fest

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

Swift 4

Wenn Sie versuchen, Ihren Tastaturtyp zu ändern, wenn eine Bedingung erfüllt ist, befolgen Sie diese Anweisungen. Zum Beispiel: Wenn wir den Tastaturtyp von ändern mögen Standard auf Ziffernblock , wenn die Zählung des Textfeldes 4 oder 5 ist , dann dies zu tun:

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

Hierfür gibt es eine Eigenschaft namens keyboardType. Was Sie tun möchten, ist zu ersetzen, wo Sie Zeichenfolgen haben @"Number Padund @"Defaultdurch UIKeyboardTypeNumberPadundUIKeyboardTypeDefault .

Ihr neuer Code sollte ungefähr so ​​aussehen:

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

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

Viel Glück!

Kyle Rosenbluth
quelle
1

für Leute, die UIDatePickerals Eingabe verwenden möchten :

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

Dies ist die UIKeyboardTypesfür 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
}

Dies ist ein Beispiel für die Verwendung eines Tastaturtyps aus der Liste:

textField.keyboardType = .numberPad
Pableiros
quelle
0

Ändern Sie programmgesteuert den UITextField-Tastaturtyp 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
quelle
0

Hier sind die Tastaturtypen in 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
quelle