Thay đổi theo chương trình Kiểu bàn phím UITextField


175

Có thể lập trình thay đổi loại bàn phím của uitextfield để có thể có thứ gì đó như thế này không:

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

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

3
Tôi muốn đề nghị bạn thay đổi thuật ngữ doozythành một cái gì đó dễ hiểu hơn .. hãy nhớ rằng SO là một trang web quốc tế chứ không phải là một trang web ở Bắc Mỹ
abbood

Câu trả lời:


371

Có một keyboardTypetài sản cho một 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;

Mã của bạn nên đọc

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

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

7
Lưu ý rằng điều này không ngăn người dùng thông minh / loạn trí nhập các ký tự khác. Ví dụ: Nếu bàn phím Emoji đã hoạt động trước khi họ gõ vào trường số của bạn, họ có thể tự do nhập khuôn mặt cười vào đó. Bạn không thể làm gì về vấn đề này và đó chắc chắn là lỗi của Apple, nhưng bạn nên đảm bảo mã của mình không bị sập nếu bạn không có số trong trường số.
Steven Fisher

Được tìm thấy ngày hôm nay, đây là một tài sản của UITextInputTraitsgiao thức, UITextFieldthông qua.
rounak

1
Có thể thay đổi loại bàn phím theo chương trình là UIKeyboardTypeNumbersAndPuncinating, cho các trường nhập HTML được tải trong webview không?
Srini

Tôi đã tạo uitextfield theo chương trình trong một dự án với loại bàn phím tương ứng. điều này được đánh thức vài ngày trước. nhưng bây giờ điều này không hiệu quả. Không hiểu lý do thực tế
Rahul Phate

78

Điều đáng chú ý là nếu bạn muốn một trường hiện đang tập trung để cập nhật loại bàn phím ngay lập tức, có thêm một bước:

// textField is set to a UIKeyboardType other than UIKeyboardTypeEmailAddress

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

Nếu không có lệnh gọi reloadInputViews, bàn phím sẽ không thay đổi cho đến khi trường được chọn ( phản hồi đầu tiên ) mất và lấy lại tiêu điểm.

Một danh sách đầy đủ các UIKeyboardTypegiá trị có thể được tìm thấy ở đây , hoặc:

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

Đây là thông tin hữu ích cần biết- Tôi khuyên bạn nên thực hiện một câu hỏi tự trả lời theo kiểu Hỏi & Đáp chỉ để trích xuất thông tin về thay đổi đầu vào hiện đang tập trung (đó là điều tôi đang tìm kiếm khi tìm thấy câu trả lời này)
Stonz2

1
Một điều đáng nói nữa là việc gọi reloadInputViews trên trường văn bản hiện không được tập trung sẽ không thay đổi loại bàn phím ngay lập tức. Vì vậy, trước tiên hãy gọi [textfield trở thànhFirstResponder] sau đó [textField reloadInputViews]
Qiulang

1
Đó là [textField reloadInputViews];tôi đã mất tích. Cảm ơn!
Hồi giáo Q.

1
Gọi reloadInputViewscũng hoạt động để UITextInputthực hiện bespoke .
Paul Gardiner

23

Có, bạn có thể, ví dụ:

[textField setKeyboardType:UIKeyboardTypeNumberPad];

9
    textFieldView.keyboardType = UIKeyboardType.PhonePad

Đây là cho nhanh chóng. Ngoài ra để điều này hoạt động đúng, nó phải được đặt sautextFieldView.delegate = self


7

để làm cho trường văn bản chấp nhận số alpha chỉ đặt thuộc tính này

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

Swift 4

Nếu bạn đang cố gắng thay đổi loại bàn phím của mình khi một điều kiện được đáp ứng, hãy làm theo điều này. Ví dụ: Nếu chúng tôi muốn thay đổi loại bàn phím từ Mặc định thành Số Pad khi số lượng trường văn bản là 4 hoặc 5, thì hãy làm điều này:

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

Có một tài sản cho việc này được gọi là keyboardType. Những gì bạn sẽ muốn làm là thay thế nơi bạn có chuỗi @"Number Pad@"Defaultvới UIKeyboardTypeNumberPadUIKeyboardTypeDefault.

Mã mới của bạn sẽ trông giống như thế này:

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

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

Chúc may mắn!


1

cho những người muốn sử dụng UIDatePickerlàm đầu vào:

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

Đây là bản UIKeyboardTypesdành cho 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
}

Đây là một ví dụ để sử dụng loại bàn phím từ danh sách:

textField.keyboardType = .numberPad

0

Thay đổi theo chương trình UITextField Kiểu bàn phím 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

Dưới đây là loại bàn phím trong 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.