Pour mon application, j'ai roulé mon propre clavier numérique. Créé vue modal avec tous les boutons dont je avais besoin, et quand ma UITextfield
sous-classe devient le premier répondeur j'anime dans.
Un peu de travail, mais vous pouvez aussi personnaliser l'apparence & sensation (avec vos propres boutons agréables etc) qui est ce que je voulais pour mon application.
Mise à jour: Mon DecimalKeyboardViewController:
J'utilise en fait une sous-classe de UIControl au lieu d'un UITextField parce que je l'afficher d'une manière personnalisée. Si je devais sous-classe UITextField je ferais quelque chose comme ceci:
@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
Voici le DecimalKeyboardViewController. Vous devrez créer le fichier nib et ajouter des balises aux boutons (0-9 pour les nombres probablement, et d'autres balises pour les autres boutons que vous utiliserez), puis relier les boutons à -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
Mise à jour 2: Depuis que j'ai sous-classé UIControl
je n'ai pas eu à faire face à l'apparition du clavier standard. Si vous sous-classe UITextfield
je pense que le clavier normal serait également affiché. Vous auriez à éviter cela (pas sûr comment) ou sous-classe UIControl
comme je l'ai fait.
est ici une question similaire qui avait quelques bonnes réponses: oui http://stackoverflow.com/questions/276382/best-way-to-enter-numeric-values-with-decimal-points –
j'ai vu ça. l'OP commence avec des décimales, puis le poste passe à la modification des nombres en monnaie. je n'ai pas besoin de conversion de devises avec des décimales j'ai besoin de la possibilité de permettre à l'utilisateur d'entrer 3454.43434343 par exemple – HollerTrain