2012-02-28 34 views
9

Trong UITextField chúng tôi chỉ Nhập Numeric và hạn chế lên đến 3 số cho điều này tôi sử dụng mã dưới đâyLàm thế nào để nhập số chỉ trong UITextField và giới hạn chiều dài tối đa?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 


    NSUInteger newLength = [textField.text length] + [string length] - range.length; 

    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet]; 

    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 

    while (newLength < CHARACTER_LIMIT) { 
     return [string isEqualToString:filtered]; 
    } 

/* Limits the no of characters to be enter in text field */ 

    return (newLength > CHARACTER_LIMIT) ? NO : YES; 

} 

Khi tôi bấm bấm dài trên TextField (như bên dưới hình ảnh) và nhập chuỗi giữa hai con số nó cho phép tất cả các ký tự đặc biệt và người thuê tàu cũng vậy. enter image description here

+0

có thể sử dụng biểu thức chính quy cho rằng –

+0

[Câu trả lời này] (http://stackoverflow.com/a/8370624/927947) nên giúp. Có thể dupe. – NJones

Trả lời

40

Không phải là tôi không thích the answer I wrote at this question, đó là copy & pasted đây cũng có. Tôi sẽ cố gắng giải thích lỗi của bạn.

Câu trả lời này được dựa trên giả định rằng các hằng số của bạn được định nghĩa như thế này:

#define NUMBERS_ONLY @"1234567890" 
#define CHARACTER_LIMIT 3 

Lý do logic của bạn là không là bạn không bao giờ xử lý sự kiện khi newLength sẽ bằng với CHARACTER_LIMIT.

Để minh họa giả sử trường văn bản của bạn trống và bạn yêu cầu dán chuỗi @"ABC" vào trường văn bản, phương thức ủy nhiệm của bạn được gọi. Bạn tạo chuỗi filtered đánh giá đúng chuỗi trống và bạn không thể đợi để thực hiện dòng return [string isEqualToString:filtered]; nhưng bạn không bao giờ thực sự đánh giá dòng đó vì bạn không đáp ứng các yêu cầu đầu vào cho vòng lặp while vì newLength là 3. do đó, đơn giản return (newLength > CHARACTER_LIMIT) ? NO : YES; sẽ quyết định giá trị trả lại.

Nếu CHARACTER_LIMIT của bạn thực sự là 4 vì một lý do nào đó, chỉ cần tưởng tượng @"ABCD" làm chuỗi logic vẫn áp dụng.

Dưới đây là một ví dụ đơn giản về chức năng của bạn đã được sửa chữa để hoạt động. Một lần nữa tôi giả định rằng CHARACTER_LIMIT bằng 3.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSUInteger newLength = [textField.text length] + [string length] - range.length; 
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet]; 
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 
    return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT)); 
} 
+0

Cảm ơn bạn rất nhiều! – Magurizio

+0

thay vào đó bạn có thể sử dụng [NSCharacterSet decimalDigitCharacterSet]? –

0

Kiểm tra UITextFieldDelegate phương pháp

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

Phương pháp này sẽ được gọi mỗi lần sau khi bạn gõ/khai thác một nhân vật hoặc bấm cắt/dán và trước khi hành động mà thay đổi ký tự hiển thị. Ở đây bạn có thể rất tốt để kiểm tra của bạn cho maxLength và số chỉ văn bản đầu vào (bằng cách sử dụng RegularExpression patter như đưa ra dưới đây) và trả lại YES hoặc NO basd trên đó. Nếu bạn trả lại CÓ, nó sẽ làm thay đổi nếu không nó sẽ không. Hy vọng điều này sẽ xóa bỏ sự nghi ngờ của bạn.

5
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    // Check for non-numeric characters 
    NSUInteger lengthOfString = string.length; 
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) { 
     unichar character = [string characterAtIndex:loopIndex]; 
     if (character < 48) return NO; // 48 unichar for 0 
     if (character > 57) return NO; // 57 unichar for 9 
    } 
    // Check for total length 
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length; 
    if (proposedNewLength > 3) return NO; 
    return YES; 
    } 

của nó làm việc tốt cho tôi u có thể sử dụng mã này

+0

Có. mã tốt và làm việc của nó. –

1
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *s = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^\\d{0,3}$" options:0 error:nil]; 
    NSTextCheckingResult *match = [regex firstMatchInString:s options:0 range:NSMakeRange(0, [s length])]; 
    return (match != nil); 
} 
0

Tôi thích sử dụng một NSNumberFormatter chứng thực văn bản có thể được phân tích thành một số. NSNumberFormatter trả về nil nếu chuỗi không thể được chuyển đổi thành một số. Điều này cho phép bạn phản ứng với đầu vào (tức là làm cho màu đỏ văn bản, ném lên một cảnh báo)

NSNumber* value = nil; 
NSNumberFormatter* format = [[NSNumberFormatter alloc] init]; 
value = [format numberFromString:someValueString];//returns and 
if (value == nil){ 
    //do something useful i.e. show alert 
} 
Các vấn đề liên quan