2009-12-22 3 views
2

Donc, après avoir finalement appris à stocker l'entrée de l'utilisateur dans une variable, je me rends compte qu'il est plutôt difficile d'avoir des nombres d'entrée de l'utilisateur avec des nombres décimaux. Le Number KeyPad n'autorise pas de partie décimale, et si j'utilise Numbers & Ponctuation cela semble un peu bizarre.Quelle est la meilleure façon d'entrer des nombres décimaux avec un SDK iPhone?

Alors, dois-je utiliser un sélecteur de numéros pour permettre aux utilisateurs de saisir des nombres en douceur? OU devrais-je simplement utiliser les chiffres & Ponctuation depuis que j'ai pu apprendre à stocker cette entrée (presque)?

Toute aide serait grandement appréciée.

+0

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 –

+1

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

Répondre

2

Vous pouvez toujours suivre le same philosophy utilisé pour un bouton Terminé sur le pavé numérique. Fondamentalement, vous faites votre propre bouton point décimal dans cet espace vide dans le coin inférieur gauche. Il suffit de suivre les instructions pour ajouter et surveiller le bouton. La seule chose que vous auriez besoin de changer serait @selector(doneButton:) à @selector(decimalButton:). Votre méthode pour le bouton décimal serait:

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

TY pour votre réponse. Wow, on dirait qu'il y a du travail là-dedans :) Merveille ce qui serait plus facile: Faire un clavier révisé ou apprendre à convertir les données UIPicker en une variable .... Apple autorisera-t-il la modification du clavier lors de la revue de l'application? – HollerTrain

+0

Haha, ne devrait pas être trop difficile si vous connaissez Photoshop. ;) L'option que vous choisissez dépend de votre application. Une chose à garder à l'esprit est que les utilisateurs détestent être limités à un ensemble spécifique d'options. Et oui, Apple autorise presque tout ce qui n'utilise aucune API privée. J'ai maintenant une application qui sous-classe 'UIAlertView' pour ajouter un' UITextField' sans aucun problème. Et dans votre cas, tout ce que vous faites est de faire un 'UIButton' qui * arrive * à se déplacer avec le clavier! –

+0

ouais mon application est si facile qu'il faudrait probablement tout le monde ce forum environ deux secondes. J'ai juste besoin de la capacité pour l'utilisateur d'entrer des nombres avec des nombres décimaux. donc je vais probablement prendre un coup à votre idée. J'apprécie vraiment votre aide Chris, et ne soyez pas surpris de me voir ici encore pour une autre question concernant mon App douloureusement simple :) – HollerTrain

0

Si vous ne voulez pas aller avec la réponse de Chris, vous pouvez utiliser des chiffres et clavier de ponctuation, puis « désactiver » tous les non chiffres/entrées de la virgule décimale en mettant en œuvre les méthodes de UITextFieldDelegate

1

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.

+0

Une chance d'afficher un exemple de la façon dont vous configurez votre clavier client? – Tim

+0

Merci Thomas! – Tim

0

Dans le SDK 3.0 notes de version, Apple a écrit l'avertissement suivant:

Ne pas dessiner des boutons personnalisés sur le dessus des claviers existants. N'importe quel nombre de problèmes de dessin, d'événement ou de compatibilité peut survenir.

Maintenant, il est vrai, ils ont été acceptent des applications qui ajoutent une touche sur un clavier existant, mais cette technique utilise un lien sans papier à la vue et UIKeyboard pourrait facilement être rejeté la prochaine fois qu'il est soumis. Techniquement, cela tombe dans le domaine de l'API non documenté, mais je ne crois pas que leurs outils automatisés le ramassent, donc ils ne sont pas signalés.

Vous devez envoyer un bug sur le site Apple Developer Connection, car ils comptent le nombre de rapports de bugs sur cette question avant qu'ils ne traiteront formellement ...

Il y a un certain nombre de façons dont ils pourraient fixer ceci, y compris:

1) Supporte plus d'options de clavier prédéfinies (décimales, devises, etc.). 2) exposer les méthodes UIKeyboard 3) Fournir la personnalisation des options de clavier qui peuvent être localisés

Si vous avez l'intention de localiser votre application, vous aurez des problèmes avec des tailles différentes du clavier lorsque vous superposez un « » touche sur l'espace vide sur l'un des claviers existants (même problème que le bouton "Terminé" dans cette approche). J'utilise actuellement le "." dans une de mes propres applications, et finira probablement par créer un clavier "décimal" entièrement personnalisé pour le remplacer afin que je ne risque pas d'être rejeté dans une mise à jour de l'application à l'avenir.

-t

Questions connexes