使用iPhone SDK输入十进制数的最佳方法是什么?

时间:2009-12-22 21:02:25

标签: iphone

因此,在最终学习如何将用户输入存储到变量之后,我意识到用户输入带小数的数字是相当困难的。 Number KeyPad不允许小数部分,如果我使用Numbers&标点符号看起来有点奇怪。

那么我是否必须使用数字选择器来顺利地允许用户输入数字?或者我应该只使用数字&标点符号,因为我能够学习如何存储输入(差不多)?

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

您可以随时按照数字键盘上用于完成按钮的same philosophy。基本上,您可以在左下方的空白区域中创建自己的小数点按钮。

只需按照添加和监控按钮的说明操作即可。您需要更改的唯一内容是@selector(doneButton:)@selector(decimalButton:)。您的小数点按钮的方法是:

- (void)decimalButton: (id) sender {
     myTextField.text = [myTextField.text stringByAppendingString:@"."];
}

答案 1 :(得分:1)

对于我的应用,我推出了自己的数字键盘。使用我需要的所有按钮创建了一个模态视图,当我的UITextfield子类成为第一个响应者时,我将其设置为动画。

相当多的工作,但你也可以自定义外观&感觉(用你自己漂亮的按钮等)这是我想要的应用程序。

更新:我的DecimalKeyboardViewController:

我实际上使用的是UIControl的子类而不是UITextfield,因为我以某种自定义方式显示它。如果我是UITextfield的子类,我会做这样的事情:

@interface DecimalNumberTextfield : UITextfield {
    NSDecimalNumber *value;
}
@property (nonatomic, retain) NSDecimalNumber *value
@end

@implementation DecimalNumberTextfield
- (BOOL)becomeFirstResponder
{
    if ([super becomeFirstResponder]) {
        [[DecimalKeyboardViewController sharedDecimalKeyboardViewController] showForField:self];
        return YES;
    } else {
        return NO;
    }
}
- (BOOL)resignFirstResponder
{
    if ([super resignFirstResponder]) {
        [[DecimalKeyboardViewController sharedDecimalKeyboardViewController] hide];
        return YES; 
    } else {
        return NO;
    }
}
- (void)setValue:(NSDecimalNumber *)aValue {
    // you need to set value and update the displayed text here
}
@end

这是DecimalKeyboardViewController。您需要创建nib文件并向按钮添加标签(可能是数字0-9,以及您使用的其他按钮的其他标签),然后将按钮连接到-buttonPressed:

@interface DecimalKeyboardViewController : UIViewController {
    DecimalNumberTextField *fieldBeingEdited;
}
@property (nonatomic, retain) DecimalNumberTextField *fieldBeingEdited;

+ (id)sharedDecimalKeyboardViewController;
- (void)showForField:(DecimalNumberTextField *)aTextField;
- (void)hide;
- (IBAction)buttonPressed:(id)sender;
@end

@implementation DecimalKeyboardViewController
static DecimalKeyboardViewController *sharedViewController;

+ (id)sharedDecimalKeyboardViewController
{
    if (!sharedViewController) {
        sharedViewController = [[DecimalKeyboardViewController alloc]
                                initWithNibName:@"DecimalKeyboardViewController"
                                         bundle:[NSBundle mainBundle]];
    }
    return sharedViewController;
}
- (void)showForField:(DecimalNumberTextField *)aTextField
{
    self.fieldBeingEdited = aTextField;

    // add ourselves to the window unless we're there already
    UIWindow *theWindow = self.fieldBeingEdited.window;
    CGRect frame = self.view.frame;

    if (!self.view.superview) { // add ourselves to the UIWindow unless we're already visible
        frame.origin.y = theWindow.frame.size.height; // we start just out of sight at the bottom
        self.view.frame = frame;
        [theWindow addSubview:self.view];
    }

    // start animating
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    // animate the keyboard in
    frame.origin.y = theWindow.frame.size.height - frame.size.height;
    self.view.frame = frame;

    // GO!
    [UIView commitAnimations];
}
- (void)hide
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    if (self.view.superview) {
        CGRect frame = self.view.frame;
        frame.origin.y = self.view.superview.frame.size.height;
        self.view.frame = frame;
    }

    [UIView commitAnimations];

    self.fieldBeingEdited = nil;    
}
- (IBAction)buttonPressed:(id)sender
{
    UIButton *button = (UIButton *)sender;

    NSDecimalNumber *oldNumber = self.fieldBeingEdited.value;
    NSDecimalNumber *newNumber;

    switch (button.tag) {
        // calculate the new number based on what button the user pressed
    }

    // update the DecimalNumbertextfield
    self.fieldBeingEdited.value = newNumber;
}
@end

更新2 :由于我已经将UIControl子类化,因此我无需处理弹出的标准键盘。如果你继承UITextfield,我认为普通键盘也会显示出来。你必须像我一样以某种方式(不确定如何)或子类UIControl来阻止它。

答案 2 :(得分:0)

如果您不想使用Chris的答案,可以使用数字和标点键盘,然后通过实施UITextFieldDelegate

的方法“禁用”所有非数字/小数点输入

答案 3 :(得分:0)

在SDK 3.0发行说明中,Apple写了以下警告:

  

不要在现有键盘的顶部绘制自定义按钮。可能会出现任意数量的绘图,事件或兼容性问题。

现在确实如此,他们一直在接受在现有键盘上添加按钮的应用程序,但是这种技术使用未记录的UIKeyboard View链接,并且在下次提交时很容易被拒绝。从技术上讲,它属于未记录的API领域,但是我不相信他们的自动化工具会把它拿起来所以它没有被标记。

你应该在Apple Developer Connection网站上发布一个错误,因为他们正在计算关于这个问题的错误报告的数量,然后才能正式解决它...

他们可以通过多种方式解决此问题,包括:

1)支持更多预定义的键盘选项(十进制,货币等)。 2)公开UIKeyboard方法 3)提供可以本地化的自定义键盘选项

如果您打算本地化您的应用程序,当您覆盖“。”时,您将遇到不同小键盘大小的问题。键入其中一个现有键盘上的空白区域(与该方法中“完成”按钮相同的问题)。

我目前正在使用重叠的“。”在我自己的一个应用程序中,可能最终会创建一个完全自定义的“十进制”键盘来替换它,所以我不会冒着将来在App更新中被拒绝的风险。

-t