เปลี่ยน UITextField คีย์บอร์ดชนิดโดยทางโปรแกรม


175

เป็นไปได้ไหมที่จะเปลี่ยนชนิดแป้นพิมพ์ของ uitextfield โดยทางโปรแกรมเพื่อให้สิ่งนี้เป็นไปได้:

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

if(user is prompted for alphanumeric input)
    [textField setKeyboardType: @"Default"];

3
ฉันขอแนะนำให้คุณเปลี่ยนคำศัพท์doozyเป็นสิ่งที่เข้าใจได้มากกว่าปกติโปรดจำไว้ว่า SO เป็นเว็บไซต์ระดับนานาชาติและไม่ใช่แบบอเมริกาเหนือ
abbood

คำตอบ:


371

มีkeyboardTypeคุณสมบัติสำหรับ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;

รหัสของคุณควรอ่าน

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

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

7
โปรดทราบว่าสิ่งนี้จะไม่หยุดผู้ใช้ที่ฉลาด / ไม่ถูกต้องไม่ให้ป้อนอักขระอื่น ตัวอย่างเช่น: หากแป้นพิมพ์ Emoji นั้นเปิดใช้งานก่อนที่พวกเขาจะแตะฟิลด์หมายเลขของคุณพวกเขาก็สามารถพิมพ์หน้ายิ้มได้ ไม่มีอะไรที่คุณสามารถทำได้เกี่ยวกับเรื่องนี้และมันเป็นข้อผิดพลาดของ Apple แน่นอน แต่คุณควรตรวจสอบให้แน่ใจว่าโค้ดของคุณไม่ผิดพลาดหากคุณได้รับตัวเลขที่ไม่ใช่ตัวเลขในฟิลด์ตัวเลข
Steven Fisher

พบได้ในวันนี้นี่คือคุณสมบัติของUITextInputTraitsโปรโตคอลที่UITextFieldใช้
rounak

1
เป็นไปได้ไหมที่จะเปลี่ยนชนิดแป้นพิมพ์โดยทางโปรแกรมเป็น UIKeyboardTypeNumbersAndPunctuation สำหรับฟิลด์อินพุต HTML ที่โหลดในเว็บวิว?
Srini

ฉันสร้าง uitextfield โดยทางโปรแกรมในโครงการหนึ่งโดยใช้แป้นพิมพ์ตามลำดับ สิ่งนี้เกิดขึ้นเมื่อไม่กี่วันที่ผ่านมา แต่ตอนนี้มันไม่ทำงาน ไม่ได้รับเหตุผลที่แท้จริง
Rahul Phate

78

เป็นที่น่าสังเกตว่าถ้าคุณต้องการให้ฟิลด์ที่มุ่งเน้นในปัจจุบันอัปเดตชนิดของแป้นพิมพ์ในทันทีมีขั้นตอนพิเศษหนึ่งขั้นตอน:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

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

โดยไม่ต้องเรียกร้องให้reloadInputViewsแป้นพิมพ์จะไม่เปลี่ยนแปลงจนกว่าเขตข้อมูลที่เลือก (คนแรกตอบกลับ ) สูญเสียและมุ่งเน้น Regains

รายการทั้งหมดของUIKeyboardTypeค่าสามารถพบได้ที่นี่หรือ:

typedef enum : NSInteger {
    UIKeyboardTypeDefault,
    UIKeyboardTypeASCIICapable,
    UIKeyboardTypeNumbersAndPunctuation,
    UIKeyboardTypeURL,
    UIKeyboardTypeNumberPad,
    UIKeyboardTypePhonePad,
    UIKeyboardTypeNamePhonePad,
    UIKeyboardTypeEmailAddress,
    UIKeyboardTypeDecimalPad,
    UIKeyboardTypeTwitter,
    UIKeyboardTypeWebSearch,
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable
} UIKeyboardType;

นี่เป็นข้อมูลที่มีประโยชน์ที่ควรรู้ - ฉันขอแนะนำให้ทำคำถามที่ตอบเองแบบถามตอบเพื่อดึงข้อมูลเกี่ยวกับการเปลี่ยนแปลงอินพุตฟิลด์ที่เน้นในปัจจุบัน (นั่นคือสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำตอบนี้)
Stonz2

1
นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่าการโทร reloadInputViews บนฟิลด์ข้อความที่ไม่ได้เน้นในขณะนี้จะไม่เปลี่ยนประเภทแป้นพิมพ์ทันที ดังนั้นควรเรียก [textfield กลายเป็น FirstResponder] ก่อนแล้วจึง [textField reloadInputViews]
Qiulang

1
มันเป็น[textField reloadInputViews];สิ่งที่ฉันขาดหายไป ขอบคุณ!
อิสลาม Q.

1
การโทรreloadInputViewsยังใช้งานได้กับการUITextInputติดตั้งตามความต้องการ
Paul Gardiner


9
    textFieldView.keyboardType = UIKeyboardType.PhonePad

นี่คือเพื่อรวดเร็ว นอกจากนี้เพื่อให้สามารถใช้งานได้อย่างถูกต้องจะต้องตั้งค่าหลังจากtextFieldView.delegate = self


7

เพื่อให้ฟิลด์ข้อความยอมรับตัวเลขและตัวอักษรให้ตั้งค่าคุณสมบัตินี้เท่านั้น

textField.keyboardType = UIKeyboardTypeNamePhonePad;

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;

5

สวิฟต์ 4

หากคุณพยายามที่จะเปลี่ยนประเภทแป้นพิมพ์ของคุณเมื่อเงื่อนไขตรงตามนี้ ตัวอย่างเช่น: หากเราต้องการเปลี่ยนประเภทแป้นพิมพ์จากDefaultเป็นNumber Padเมื่อจำนวนฟิลด์ข้อความเท่ากับ 4 หรือ 5 ให้ทำดังนี้

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()
 }

2

keyboardTypeมีคุณสมบัติสำหรับการนี้เรียกว่าเป็น สิ่งที่คุณจะต้องการที่จะทำคือแทนที่ที่คุณมีสาย @"Number Padและ@"Defaultด้วยและUIKeyboardTypeNumberPadUIKeyboardTypeDefault

รหัสใหม่ของคุณควรมีลักษณะดังนี้:

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

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

โชคดี!


1

สำหรับผู้ที่ต้องการใช้UIDatePickerเป็นอินพุต:

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]];
}

1

นี่คือUIKeyboardTypesสำหรับ 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
}

นี่คือตัวอย่างการใช้แป้นพิมพ์จากรายการ:

textField.keyboardType = .numberPad

0

เปลี่ยน 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)
}

0

นี่คือประเภทของแป้นพิมพ์ใน 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.