如何仅在UITextField中输入Numbers并限制最大长度?

sre*_*vas 10 objective-c uitextfield ios4

在UITextField中,我们仅输入数字并限制最多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:@""];

    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; 

}
Run Code Online (Sandbox Code Playgroud)

当我长按文本字段(如下图所示)并在两个数字之间输入字符串时,它也允许所有特殊字符和租船人. 在此输入图像描述

NJo*_*nes 41

并不是说我不喜欢我在这个问题上写的答案,也就是复制和粘贴在这里.我会试着解释你的错误.

这个答案是基于这样的假设:你的常量定义如下:

#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 3
Run Code Online (Sandbox Code Playgroud)

你的逻辑失败的原因是你永远不会处理事件,因为newLength它将等于CHARACTER_LIMIT.

为了说明假设您的textfield为空并且您要求将字符串粘贴@"ABC"到文本字段,则调用您的委托方法.你创建了filtered一个正确计算为空字符串的字符串,你不能等待执行该行,return [string isEqualToString:filtered];但你实际上从未评估该行,因为你不满足while循环的入口要求,因为它newLength是3.所以简单return (newLength > CHARACTER_LIMIT ) ? NO : YES;决定返回值.

如果CHARACTER_LIMIT由于某种原因你实际上是4,那么想象一下@"ABCD"逻辑仍然适用的字符串.

这是一个简单的功能修正工作示例.我再次假设它CHARACTER_LIMIT等于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));
}
Run Code Online (Sandbox Code Playgroud)


Ram*_*Rao 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;
    }
Run Code Online (Sandbox Code Playgroud)

它的工作正常,你可以使用此代码