Làm cách nào để tôi chỉ cho phép nhập các ký tự chữ và số trong iOS UITextField
?Chỉ cho phép các ký tự chữ và số cho UITextField
Trả lời
Sử dụng phương thức UITextFieldDelegate -textField:shouldChangeCharactersInRange:replacementString:
với một NSCharacterSet chứa nghịch đảo của các ký tự bạn muốn cho phép. Ví dụ:
// in -init, -initWithNibName:bundle:, or similar
NSCharacterSet *blockedCharacters = [[[NSCharacterSet alphanumericCharacterSet] invertedSet] retain];
- (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
{
return ([characters rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound);
}
// in -dealloc
[blockedCharacters release];
Lưu ý rằng bạn sẽ cần phải tuyên bố rằng lớp học của bạn thực hiện các giao thức (ví dụ: @interface MyClass : SomeSuperclass <UITextFieldDelegate>
) và thiết lập các lĩnh vực văn bản của delegate
đến thể hiện của lớp học của bạn.
Đây là cách tôi làm điều đó:
// Define some constants:
#define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define NUMERIC @"1234567890"
#define ALPHA_NUMERIC ALPHA NUMERIC
// Make sure you are the text fields 'delegate', then this will get called before text gets changed.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// This will be the character set of characters I do not want in my text field. Then if the replacement string contains any of the characters, return NO so that the text does not change.
NSCharacterSet *unacceptedInput = nil;
// I have 4 types of textFields in my view, each one needs to deny a specific set of characters:
if (textField == emailField) {
// Validating an email address doesnt work 100% yet, but I am working on it.... The rest work great!
if ([[textField.text componentsSeparatedByString:@"@"] count] > 1) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".-"]] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".!#$%&'*+-/=?^_`{|}[email protected]"]] invertedSet];
}
} else if (textField == phoneField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMERIC] invertedSet];
} else if (textField == fNameField || textField == lNameField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet illegalCharacterSet] invertedSet];
}
// If there are any characters that I do not want in the text field, return NO.
return ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] <= 1);
}
Kiểm tra các UITextFieldDelegate Reference quá.
Đó là thực sự hữu ích. Điều duy nhất tôi thêm là 'if (([string isEqualToString: @" @ "]) && (range.location == 0)) {unacceptedInput = [NSCharacterSet characterSetWithCharactersInString: @" @ "]; } ' bên trong emailLoại chi nhánh để ngăn @ đang được sử dụng để bắt đầu địa chỉ email – Ryan
Bạn sẽ phải sử dụng phương thức textField delegate
và sử dụng các phương pháp textFieldDidBeginEditing
, shouldChangeCharactersInRange
và textFieldDidEndEditing
để kiểm tra ký tự.
Vui lòng tham khảo this link để biết tài liệu.
Tôi tìm thấy một câu trả lời đơn giản và làm việc và muốn chia sẻ:
kết nối UITextField của bạn cho sự kiện này EditingChanged để sau IBAction
-(IBAction) editingChanged:(UITextField*)sender
{
if (sender == yourTextField)
{
// allow only alphanumeric chars
NSString* newStr = [sender.text stringByTrimmingCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];
if ([newStr length] < [sender.text length])
{
sender.text = newStr;
}
}
}
+1 cho tính sáng tạo – ArtOfWarfare
Câu hỏi - có so sánh độ dài nào tốt hơn so với chỉ so sánh nội dung không?Trừ khi độ dài thực sự được lưu trữ trong đối tượng NSString, tôi sẽ tưởng tượng một trong hai cách mà so sánh sẽ có thời gian 'm + n', trong đó' m' là độ dài của 'newStr' và' n' là độ dài 'sender.text '. – ArtOfWarfare
Đối Swift: Kết nối UITextField của bạn cho sự kiện này EditingChanged đến sau IBAction:
@IBAction func ActionChangeTextPassport(sender:UITextField){
if sender == txtPassportNum{
let newStr = sender.text?.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)
if newStr?.characters.count < sender.text?.characters.count{
sender.text = newStr
}
}
}
Swift 3 version
Hiện nay chấp nhận phương án trả lời:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Attempt to find the range of invalid characters in the input string. This returns an optional.
let range = string.rangeOfCharacter(from: invalidChars)
if range != nil {
// We have found an invalid character, don't allow the change
return false
} else {
// No invalid character, allow the change
return true
}
}
Một cách tiếp cận bình đẳng chức năng:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Make new string with invalid characters trimmed
let newString = string.trimmingCharacters(in: invalidChars)
if newString.characters.count < string.characters.count {
// If there are less characters than we started with after trimming
// this means there was an invalid character in the input.
// Don't let the change go through
return false
} else {
// Otherwise let the change go through
return true
}
}
Cách RegEx trong Swift:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty {
return true
}
let alphaNumericRegEx = "[a-zA-Z0-9]"
let predicate = NSPredicate(format:"SELF MATCHES %@", alphaNumericRegEx)
return predicate.evaluate(with: string)
}
- 1. Regex chỉ cho phép các chữ cái và một số ký tự
- 2. Cách cho phép người dùng chỉ nhập các chữ cái, không có số và các ký tự khác
- 3. Cho phép chỉ chữ và số giá trị
- 4. Ký hiệu UTF8 cho các chữ cái chỉ số
- 5. C# Regex chỉ cho phép alpha số
- 6. Cụm từ thông dụng để cho phép chữ và số, chỉ một khoảng trắng và sau đó là số
- 7. Chỉ cho phép một số chữ cái, cấm ký tự đặc biệt ($% vv) ngoại trừ những người khác (' -)
- 8. Regex cho phép chữ và số, -, _ và không gian
- 9. Ký tự được phép cho số nhận dạng CSS
- 10. Regex không cho phép một số ký tự đặc biệt
- 11. PHP preg_match - chỉ cho phép chuỗi chữ và số và - _ nhân vật
- 12. Chỉ cho phép một số ký tự nhất định trong PHP
- 13. Xác thực mẫu để chỉ cho phép các ký tự bảng chữ cái trong hộp văn bản
- 14. php chỉ cho phép chữ cái, số, dấu cách và ký hiệu cụ thể sử dụng tiền tố
- 15. Sử dụng các phông chữ khác nhau cho các ký tự Latinh và các ký tự tiếng Nhật với CSS
- 16. Phông chữ Chiếc đĩa bay cho các ký tự unicode
- 17. Trình xác thực biểu thức chính quy cho các chữ cái và số chỉ
- 18. Làm thế nào để làm cho một TextBox chỉ chấp nhận các ký tự chữ cái?
- 19. Cụm từ thông dụng chỉ cho phép các ký tự hoặc không gian
- 20. Tại sao Java cho phép các ký tự điều khiển trong số nhận dạng của nó?
- 21. Tạo chuỗi ký tự chữ và số trong Ruby
- 22. Các ký tự bất thường ngoài $ được cho phép trong số nhận dạng JavaScript là gì?
- 23. PHP chuỗi không cho phép < and > ký tự
- 24. regex JavaScript cho chuỗi chữ và số có độ dài từ 3-5 ký tự
- 25. Cần regex cho chuỗi phải có cả ký tự số và chữ cái
- 26. regex cho chữ và số, nhưng ít nhất một ký tự
- 27. Các ký tự của các chữ cái và số trong một số điện thoại
- 28. Bash: Tách textfile thành các từ với các ký tự chữ và số không như delimiters
- 29. Matplotlib: chỉ cho phép in chữ cái đầu tiên
- 30. Không cho phép ký tự trong mật khẩu?
Ý của bạn là: return [characters rangeOfCharacterFromSet: blockedCharacters] .location == NSNotFound; – Sagiftw
Bạn nói đúng, tôi làm. Cảm ơn vì sự đúng đắn của bạn. –
Bất kỳ lý do cụ thể nào mà bạn đảo ngược tập hợp ký tự chữ và số? Bạn không thể loại bỏ các invertedSet và sau đó thay đổi kiểm tra trở lại của bạn để! = NSNotFound? Chỉ cần tò mò vì tôi đã có một số logic xảy ra trong đó ngoài việc trả lại – nbsp