因此,在最终学习如何将用户输入存储到变量之后,我意识到用户输入带小数的数字是相当困难的。 Number KeyPad不允许小数部分,如果我使用Numbers&标点符号看起来有点奇怪。
那么我是否必须使用数字选择器来顺利地允许用户输入数字?或者我应该只使用数字&标点符号,因为我能够学习如何存储输入(差不多)?
非常感谢任何帮助。
答案 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