Iphone UITextField验证

Iphone UITextField验证,iphone,ios,objective-c,Iphone,Ios,Objective C,我正在创建一个文本字段 每当文本字段中的值大于100时,我需要显示一条警告,说明“值必须小于100”,然后文本字段的值应清除 如何执行此操作?您可以让视图控制器符合UITextFieldDelegate协议,并实现-textField:shouldChangeCharactersRange:replacementString:方法: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)

我正在创建一个文本字段

每当文本字段中的值大于100时,我需要显示一条警告,说明“值必须小于100”,然后文本字段的值应清除


如何执行此操作?

您可以让视图控制器符合
UITextFieldDelegate
协议,并实现
-textField:shouldChangeCharactersRange:replacementString:
方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (range.location == 0 && string.length == 0) {
        return YES;
    }

    // Build up the resulting string…
    NSMutableString *fullString = [[NSMutableString alloc] init];

    [fullString appendString:[textField.text substringWithRange:NSMakeRange(0, range.location)]];
    [fullString appendString:string];

    // Set up number formatter…
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSNumber *replaceNumber = [formatter numberFromString:fullString];

    [fullString release];
    [formatter release];

    return !(replaceNumber == nil || [replaceNumber intValue] > 100);
}

< >要建立完整的字符串,必须考虑文本字段中间的编辑。对上面发布的代码进行了一些更改

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    BOOL result = NO;

    // Build the final string...   
    NSMutableString *fullString = [[NSMutableString alloc] init];
    NSUInteger firstChunkLength = range.location;
    NSUInteger secondChunkStart = range.location + range.length;
    NSUInteger secondChunkLength = [textField.text length] - secondChunkStart;

    [fullString appendString:[textField.text substringWithRange:NSMakeRange( 0, firstChunkLength )]];
    [fullString appendString:string];
    [fullString appendString:[textField.text substringWithRange:NSMakeRange( secondChunkStart, secondChunkLength )]];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSNumber *replaceNumber = [formatter numberFromString:fullString];
    NSNumber *originalNumber = [formatter numberFromString:textField.text];

    result = ( replaceNumber != nil && replaceNumber != originalNumber );

    [fullString release];
    [formatter release];

    return result;
}

此方法用于仅验证UItextfield的数值

这是一个完美的整数验证

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
}

谢天谢地,现在我们有了Swift,这就容易多了。您确实需要构造预期字符串(希望当Apple在Swift中重写Cocoa时,此接口将添加该字符串)

同时,这里有一个简单的单行程序:

let constructedString = (self.inputField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
请注意,self.inputField当然是该字段的出口。此外,转换为NSString是因为我们传递的范围是NSRange。

我创建了一个类(UItextField的子类),该类允许用户非常轻松地添加验证。例如

JSInputField *inputField = [[JSInputField alloc] initWithFrame:CGRectMake(10, 100, 300, 50)];
[self.view addSubview:inputField];
[inputField setPlaceholder:@"Enter Text"];
[inputField setRoundedCorners:UIRectCornerAllCorners];
[inputField addValidationRule:JSCreateRuleNotNullValue]; //This will validate field for null value. It will show error if field is empty.
[inputField addValidationRule:JSCreateRuleNumeric(2)];  //This will validate field for numeric values and restrict to enter value upto 2 decimal places.

很好,感谢您对顶部答案的改进:)不过要提醒一句:这对“安全”字段不起作用,因为在这些字段中开始编辑会清除字段,并且不会发送shouldChangeCharactersInRange消息。更改后,您仍然需要检查值,以查看其实际结果。请解释您正在执行的操作,不要只是发布代码,因为这对用户没有帮助。在这种情况下,文本字段可能不是最合适的控件选择。使用具有最小值和最大值的选择器。不需要用户的额外验证或通知。