在 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;
}
当我长按文本字段(如下图)并在两个数字之间输入字符串时,它也允许所有特殊字符和承租人。
最佳答案
不是我不喜欢 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/