【问题标题】:Objective-C: Numbers only text field? [duplicate]Objective-C:只有数字的文本字段? [复制]
【发布时间】:2011-10-12 04:23:34
【问题描述】:

可能重复:
Iphone UITextField only integer

我想放置一个只接受数字(0-9,甚至不需要小数)的文本字段,但即使使用“数字键盘”输入选项,我仍然会得到一个带有各种符号的键盘。对此有更好的控制吗?我正在做的事情是否有更好的控制,或者我只需要手动验证输入?

【问题讨论】:

  • 我不认为这是重复的。链接的问题询问如何检测是否在测试字段中输入了非数字字符;这个问题询问如何防止非数字字符被输入。

标签: objective-c ipad numbers uitextfield validation


【解决方案1】:

以下代码将允许您仅输入数字以及限制可以使用的字符数。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
    /*  limit to only numeric characters  */
    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    for (int i = 0; i < [string length]; i++) {
        unichar c = [string characterAtIndex:i];
        if ([myCharSet characterIsMember:c]) {
            return YES;
        }
    }

    /*  limit the users input to only 9 characters  */
    NSUInteger newLength = [customTextField.text length] + [string length] - range.length;
    return (newLength > 9) ? NO : YES;
}

【讨论】:

  • 我认为使用此代码您不能使用 BackSpace 进行编辑。
  • 是的,从上面的代码你不能使用退格键,我已经在 iPad 应用程序上尝试过了
  • 这可能是重复的,但答案对我来说效果更好。
  • 这段代码在逻辑上是错误的。您不想在验证第一个字符后通过返回 YES 来跳出循环。见郑特的回答。
  • 此代码错误,您将在第一个有效字符之后离开循环。相应地,字符串“1dasdas”是有效的。
【解决方案2】:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
/* for backspace */    
    if([string length]==0){
       return YES;
    }

/*  limit to only numeric characters  */

    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    for (int i = 0; i < [string length]; i++) {
       unichar c = [string characterAtIndex:i];
       if ([myCharSet characterIsMember:c]) {
          return YES;
      }
    }

return NO;
}

【讨论】:

  • 这很好用。感谢您的快速 sn-p。
  • 干得好!
  • 这段代码有一个错误。它在替换字符串中的第一个数字字符处返回。如果有人粘贴“123ABC”,它会扫描到“1”并返回YES。下面郑特的回答是正确的,虽然它不允许退格。
  • 这就像魅力:)
【解决方案3】:

代码有点不正确,应该是

/*  limit to only numeric characters  */
NSCharacterSet* numberCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
for (int i = 0; i < [string length]; ++i)
{
    unichar c = [string characterAtIndex:i];
    if (![numberCharSet characterIsMember:c])
    {
        return NO;
    }
}

return YES;

【讨论】:

  • 这个看起来会帮我检查集合中的所有字符。检查它...这可能是公认的答案。确保将其放置在调用方法的 shouldChangeCharactersInRange 委托中。 Apple 文档建议您检查此委托方法中的数字。 (来自 shouldChangeCharactersInRange Apple 文档) 讨论 只要用户操作导致其文本发生更改,文本字段就会调用此方法。使用此方法验证用户键入的文本。例如,您可以使用此方法来防止用户输入除数值以外的任何内容。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多