2 Stimmen

Was ist der beste Weg zur Eingabe von Dezimalzahlen mit iPhone SDK?

Nachdem ich nun endlich gelernt habe, wie man Benutzereingaben in einer Variablen speichert, stelle ich fest, dass es ziemlich schwierig ist, den Benutzer Zahlen mit Dezimalstellen eingeben zu lassen. Das Number KeyPad lässt keinen Dezimalteil zu, und wenn ich Numbers & Punctuation verwende, sieht es ein bisschen komisch aus.

Muss ich also einen Number Picker verwenden, damit die Benutzer problemlos Zahlen eingeben können? ODER sollte ich einfach Zahlen und Satzzeichen verwenden, da ich gelernt habe, wie man diese Eingabe (fast) speichert?

Für jede Hilfe wären wir Ihnen sehr dankbar.

2voto

Chris Long Punkte 2893

Sie können jederzeit die dieselbe Philosophie wird für eine Taste "Fertig" auf dem Ziffernblock verwendet. Im Grunde genommen machen Sie Ihre eigene Dezimalpunkttaste in dem leeren Raum unten links.

Befolgen Sie einfach die Anweisungen zum Hinzufügen und Überwachen der Schaltfläche. Das einzige, was Sie ändern müssten, wäre @selector(doneButton:) à @selector(decimalButton:) . Ihre Methode für die Dezimaltaste wäre:

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

1voto

Thomas Müller Punkte 15400

Für meine App habe ich meine eigene Zahlentastatur entwickelt. Erstellt eine modale Ansicht mit allen Tasten, die ich brauchte, und wenn meine UITextfield Unterklasse wird zum Ersthelfer, in dem ich sie animiere.

Es ist ein bisschen Arbeit, aber man kann auch das Aussehen und die Bedienung anpassen (mit eigenen schönen Schaltflächen usw.), was ich für meine App wollte.

Update : My DecimalKeyboardViewController:

Ich verwende eigentlich eine Unterklasse von UIControl anstelle eines UITextfield, weil ich es auf eine benutzerdefinierte Weise anzeigen. Wenn ich eine Unterklasse von UITextfield verwenden würde, würde ich so etwas wie dies tun:

@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

Hier ist der DecimalKeyboardViewController. Sie müssen die nib-Datei erstellen und Tags zu den Schaltflächen hinzufügen (0-9 für die Zahlen wahrscheinlich, und andere Tags für die anderen Schaltflächen, die Sie verwenden würden), dann verbinden Sie die Schaltflächen mit -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

Aktualisierung 2 : Da ich die Subklasse UIControl Ich musste mich nicht mit der Standardtastatur herumschlagen, die auftauchte. Wenn Sie die Unterklasse UITextfield Ich denke, dass auch die normale Tastatur angezeigt werden würde. Sie müssten das irgendwie verhindern (nicht sicher wie) oder die Unterklasse UIControl wie ich es getan habe.

0voto

bpapa Punkte 21253

Wenn Sie sich nicht an die Antwort von Chris halten wollen, können Sie die Ziffern- und Interpunktions-Tastatur verwenden und dann alle Eingaben, die nicht aus Ziffern oder Dezimalpunkten bestehen, "deaktivieren", indem Sie die Methoden von UITextFieldDelegate

0voto

Tim Punkte 2724

In den SDK 3.0 Release Notes schreibt Apple die folgende Warnung:

Zeichnen Sie keine benutzerdefinierten Tasten auf vorhandene Tastaturen. Es könnte zu einer Reihe von Zeichen-, Ereignis- oder Kompatibilitätsproblemen kommen.

Es stimmt zwar, dass sie Anträge akzeptieren, die eine Schaltfläche über eine bestehende Tastatur hinzufügen, aber diese Technik verwendet einen undokumentierten Link zur UIKeyboard-Ansicht und könnte bei der nächsten Einreichung leicht abgelehnt werden. Technisch gesehen fällt es in den Bereich der undokumentierten API, aber ich glaube nicht, dass ihre automatisierten Tools es erkennen, so dass es nicht gekennzeichnet wird.

Sie sollten einen Fehler auf der Apple Developer Connection Website melden, da sie die Anzahl der Fehlerberichte zu diesem Problem zählen, bevor sie sich offiziell damit befassen...

Es gibt eine Reihe von Möglichkeiten, dies zu beheben, unter anderem:

1) Unterstützung von mehr vordefinierten Tastaturoptionen (Dezimalzahlen, Währungen, etc.). 2) Offenlegung der UIKeyboard-Methoden 3) Bereitstellung von anpassbaren Tastaturoptionen, die lokalisiert werden können

Wenn Sie beabsichtigen, Ihre App zu lokalisieren, werden Sie Probleme mit unterschiedlichen Tastaturgrößen haben, wenn Sie eine "."-Taste über den leeren Platz auf einer der vorhandenen Tastaturen legen (dasselbe Problem, das die Schaltfläche "Fertig" bei diesem Ansatz hat).

Ich verwende derzeit das eingeblendete "." in einer meiner eigenen Apps und werde wahrscheinlich am Ende eine vollständig benutzerdefinierte "Dezimal"-Tastatur erstellen, um diese zu ersetzen, damit ich nicht riskiere, bei einem App-Update in der Zukunft abgelehnt zu werden.

-t

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X