Secara terprogram ubah jenis Keyboard UITextField

175

Apakah mungkin untuk secara terprogram mengubah jenis keyboard dari uitextfield sehingga sesuatu seperti ini dimungkinkan:

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType: @"Default"];
eric.mitchell
sumber
3
saya sarankan Anda mengubah istilah doozymenjadi sesuatu yang lebih umum dimengerti .. perlu diingat SO adalah situs internasional dan bukan situs Amerika Utara
abbood

Jawaban:

371

Ada keyboardTypeproperti untuk 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;

Kode Anda harus dibaca

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType:UIKeyboardTypeDefault];
Pengone
sumber
7
Perhatikan bahwa ini tidak menghentikan pengguna yang pintar / gila memasukkan karakter lain. Misalnya: Jika keyboard Emoji aktif sebelum mengetuk bidang nomor Anda, mereka bebas mengetikkan wajah yang tersenyum ke dalamnya. Tidak ada yang dapat Anda lakukan tentang ini, dan ini jelas merupakan bug Apple, tetapi Anda harus memastikan kode Anda tidak macet jika Anda mendapatkan non-angka di bidang angka.
Steven Fisher
Ditemukan hari ini, ini adalah properti UITextInputTraitsprotokol, yang UITextFieldmengadopsi.
rounak
1
Apakah mungkin untuk mengubah jenis keyboard secara terprogram sebagai UIKeyboardTypeNumbersAndPunctuation, untuk bidang input HTML yang dimuat dalam tampilan web?
Srini
Saya membuat uitextfield secara pemrograman dalam satu proyek dengan masing-masing jenis keyboard. ini terbangun beberapa hari yang lalu. tapi sekarang ini tidak berhasil. Tidak mendapatkan alasan sebenarnya
Rahul Phate
78

Perlu dicatat bahwa jika Anda ingin bidang yang saat ini difokuskan untuk segera memperbarui jenis keyboard, ada satu langkah tambahan:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

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

Tanpa ajakan untuk reloadInputViews, keyboard tidak akan berubah sampai bidang yang dipilih ( responden pertama ) kehilangan dan mendapatkan kembali fokus.

Daftar lengkap UIKeyboardTypenilai dapat ditemukan di sini , atau:

typedef enum : NSInteger {
    UIKeyboardTypeDefault,
    UIKeyboardTypeASCIICapable,
    UIKeyboardTypeNumbersAndPunctuation,
    UIKeyboardTypeURL,
    UIKeyboardTypeNumberPad,
    UIKeyboardTypePhonePad,
    UIKeyboardTypeNamePhonePad,
    UIKeyboardTypeEmailAddress,
    UIKeyboardTypeDecimalPad,
    UIKeyboardTypeTwitter,
    UIKeyboardTypeWebSearch,
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable
} UIKeyboardType;
jterry
sumber
Ini adalah informasi yang berguna untuk diketahui - saya sarankan melakukan tanya jawab gaya-T & J hanya untuk mengekstrak informasi tentang perubahan input bidang yang saat ini difokuskan (itulah yang saya cari ketika saya menemukan jawaban ini)
Stonz2
1
Perlu disebutkan juga bahwa memanggil reloadInputViews di bidang teks yang saat ini TIDAK fokus tidak akan langsung mengubah jenis keyboard. Jadi, lebih baik panggil [textfield menjadiFirstResponder] terlebih dahulu kemudian [textField reloadInputViews]
Qiulang
1
Itu [textField reloadInputViews];karena saya hilang. Terima kasih!
Islam Q.
1
Memanggil reloadInputViewsjuga berfungsi untuk UITextInputimplementasi yang dipesan lebih dahulu .
Paul Gardiner
23

Ya, Anda bisa, misalnya:

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

Ini untuk cepat. Agar ini berfungsi dengan baik, harus diatur setelahtextFieldView.delegate = self

fonz
sumber
7

untuk membuat bidang teks menerima alfanumerik hanya setel properti ini

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

Cepat 4

Jika Anda mencoba mengubah jenis keyboard Anda ketika suatu kondisi terpenuhi, ikuti ini. Sebagai contoh: Jika kita ingin mengubah jenis keyboard dari Default ke Pad Angka ketika jumlah bidang teks adalah 4 atau 5, maka lakukan ini:

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

Ada properti untuk ini yang disebut keyboardType. Apa yang ingin Anda lakukan adalah mengganti di mana Anda memiliki string @"Number Paddan @"Defaultdengan UIKeyboardTypeNumberPaddan UIKeyboardTypeDefault.

Kode baru Anda akan terlihat seperti ini:

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

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

Semoga berhasil!

Kyle Rosenbluth
sumber
1

untuk orang yang ingin digunakan UIDatePickersebagai masukan:

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

Ini UIKeyboardTypesuntuk 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
}

Ini adalah contoh untuk menggunakan jenis keyboard dari daftar:

textField.keyboardType = .numberPad
pableiros
sumber
0

Secara terprogram ubah UITextField Keyboard tipe 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
sumber
0

Berikut adalah jenis keyboard di 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
sumber