【问题标题】:UITextField - UIKeyboardTypeDecimalPad on iPad?UITextField - iPad 上的 UIKeyboardTypeDecimalPad?
【发布时间】:2011-09-15 01:57:56
【问题描述】:

在 iPad 上...

textField.keyboardType = UIKeyboardTypeDecimalPad;

...只显示常规键盘,但从顶部的数字开始(下面有很多标点符号)。

但它是输入一个数字。我只希望用户能够键入数字和小数点,就像 iPhone 上的 UIKeyboardTypeDecimalPad 一样。

有什么方法可以让不相关的键消失,让我的用户独自一人?

【问题讨论】:

    标签: objective-c ios ipad keyboard


    【解决方案1】:

    设置UITextFieldkeyboardType 只会让用户更容易输入适当的字符。即使在 iPhone 上,用户也可以通过硬件键盘或粘贴字符串来输入其他字符。

    改为实现UITextFieldDelegate-textField:shouldChangeCharactersInRange:replacementString: 来验证用户输入。您也可能真的不想硬编码数字 0-9 和句点。例如,某些语言环境中的用户使用逗号将整数与小数分开:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *candidate = [[textField text] stringByReplacingCharactersInRange:range withString:string];
        if (!candidate || [candidate length] < 1 || [candidate isEqualToString:@""])
        {
            return YES;
        }
        NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:candidate];
        if (!number || [number isEqualToNumber:[NSDecimalNumber notANumber]])
        {
            return NO;
        }
        return YES;
    }
    

    或者,您可以在用户完成输入文本时执行验证,根据需要在–textFieldShouldReturn:– textFieldShouldEndEditing:– textFieldDidEndEditing: 中。

    【讨论】:

    • 不知道为什么这被标记为答案。对于部分匹配,decimalNumberWithString 愉快地返回 0。例如:ejunk 返回 0,因此它不能用作验证器。
    • 不使用这种方式我试过了......它总是返回是,
    【解决方案2】:

    我知道这个问题已经有一段时间不活跃了,但这可能会对那里的人有所帮助。

    您可以尝试实现这个https://github.com/azu/NumericKeypad。编码器实现了他自己的数字键盘购买子类 UITextField

    【讨论】:

    • 是的。但它有效,你可以轻而易举地让它变得华丽。只需更改按钮和背景的图像。这里只是一点点努力:)
    • 太荒谬了,Apple 仍然没有屏幕上的数字键盘……这到底是怎么回事……
    • 现在是 2018 年,我们仍然没有十进制输入键盘。
    【解决方案3】:

    这不一定是万无一失的解决方案,但它符合我的需求,并且可能对其他人有所帮助。担心的是数字字符是硬编码的。我不确定使用其他数字字符的语言环境,但可以根据需要添加。

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *candidate = [[textField text] stringByReplacingCharactersInRange:range withString:string];
    
        // Ensure that the local decimal seperator is used max 1 time
        NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
        NSString *decimalSymbol = [formatter decimalSeparator];
        if ([candidate componentsSeparatedByString:decimalSymbol].count > 2) return NO;
    
        // Ensure that all the characters used are number characters or decimal seperator
        NSString *validChars = [NSString stringWithFormat:@"0123456789%@", decimalSymbol];
        if ([candidate stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:validChars]].length) return NO;
    
        return YES;
    }
    

    【讨论】:

      【解决方案4】:

      将此链接到您的 textField 的 editingChanged 方法。您可以根据需要编辑周围的字符。

      - (IBAction)numberValidator:(id)sender {
          NSMutableString *txt1 = [[NSMutableString alloc] initWithString:_numbersOnlyField.text];
          for (unsigned int i = 0; i < [txt1 length]; i++) {
              NSString *character = [[NSString alloc] initWithFormat:@"%C", [txt1 characterAtIndex:i]];
      
              // Erase any characters you don't like, but you don't feel the user needs to be alerted about
              else if ([character isEqualToString:@" "]){
                  [txt1 deleteCharactersInRange:NSMakeRange(i, 1)];
                  _numbersOnlyField.text = [[NSString alloc] initWithString:txt1];
              }
      
              // Alert the user that they shouldn't enter anything besides numbers
              if ([character integerValue] == 0 && ![character isEqualToString:@"0"]) {
                  UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Numbers only please!"
                                                                 message: @"Please only enter numbers in the \"<your text field's name here>\" text field"
                                                                delegate: nil
                                                       cancelButtonTitle:@"Sorry..."
                                                       otherButtonTitles:nil];
                  [alert show];
                  [txt1 deleteCharactersInRange:NSMakeRange(i, 1)];
                  _numbersOnlyField.text = [[NSString alloc] initWithString:txt1];
              }
          }
      }
      

      您也可以通过UIControlEventValueChanged 方法以编程方式完成。

      这只是我自己想出的一个解决方案,我绝对不认为自己是专业人士,所以我可能会忽略一些缺陷,但这对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 2014-10-28
        • 1970-01-01
        • 2012-03-25
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多