2011-09-24 37 views

Trả lời

57

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.

+0

Ý của bạn là: return [characters rangeOfCharacterFromSet: blockedCharacters] .location == NSNotFound; – Sagiftw

+0

Bạn nói đúng, tôi làm. Cảm ơn vì sự đúng đắn của bạn. –

+0

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

11

Đâ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á.

+0

Đó 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

0

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, shouldChangeCharactersInRangetextFieldDidEndEditing để kiểm tra ký tự.

Vui lòng tham khảo this link để biết tài liệu.

11

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; 
     } 
    } 
} 
+0

+1 cho tính sáng tạo – ArtOfWarfare

+0

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

1

Đố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 
     } 
    } 
} 
4

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 
    } 

} 
+0

Điều này không hoạt động nếu người dùng dán vào các ký tự không mong muốn – MarksCode

+0

@MarksCode là chính xác. Tôi đã cập nhật cách tiếp cận đó để làm việc với các ký tự được dán. Tôi cũng đã thêm phương pháp tương tự mà câu trả lời được chấp nhận sử dụng. – teradyl

1

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) 
} 
Các vấn đề liên quan