objective-c - 如何在 UITextField 中只输入数字并限制最大长度?

标签 objective-c ios4 uitextfield

在 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; 

}

当我长按文本字段(如下图)并在两个数字之间输入字符串时,它也允许所有特殊字符和承租人。 enter image description here

最佳答案

不是我不喜欢 the answer I wrote at this question ,这里也是 copy & pasted 。我会尝试解释您的错误。

此答案基于以下假设:您的常量定义如下:

#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 3

您的逻辑失败的原因是当 newLength 将等于 CHARACTER_LIMIT 时您永远不会处理该事件。

为了说明,假设您的文本字段为空并且您请求将字符串 @"ABC" 粘贴到文本字段,您的委托(delegate)方法将被调用。您创建的字符串 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));
}

关于objective-c - 如何在 UITextField 中只输入数字并限制最大长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477563/

相关文章:

ios - 重新排序单元格后如何更改 fetchresult Controller 数组中对象的顺序

objective-c - respondsToSelector - 不工作

iphone - iOS 4.2 中未调用 viewWillAppear 方法

ios - 在 Swift 中获取和设置 UITextField 和 UITextView 的光标位置

ios - 最近没有在 UIWebView 上使用 iframe 播放器播放 youtube 剪辑

ios - setBackgroundVerticalPositionAdjustment 不起作用

iphone - iPhone SDK 的 Visual Source Safe 等效项是什么?

iphone - 获取原始 Facebook Cookie 内容 iPhone

ios - 如何确保在文本字段中仅选择选择器数据

ios - 当我单击文本字段时,两个都实现了类 _PointQueue ...我该如何解决这个问题?