2017-07-25 8 views
0

Ich benutze folgende textfield delegate, um Benutzereintrag zu validieren.shouldChangeCharactersInRange verhält sich seltsam

Nehmen wir an, dass currentTotal gleich 30.00 Dollar und immer dann, wenn Nutzer gibt two times gleich oder größer als currentTotal und ich versuche, eine Warnung zu erteilen.

Während ich die Anwendung testen, wenn der Benutzer 63 Dollar eingibt, erfolgt keine Warnung, aber solange der Benutzer 630 Dollar eingibt, wird die Warnung ausgegeben.

tip und currentTotal sind double.

Was mache ich falsch, irgendwelche Vorschläge?

- (BOOL)textField:(UITextField *)aTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{  
    if ([aTextField.text containsString:@"$"]) 
    { 
     tip = [[aTextField.text stringByReplacingOccurrencesOfString:@"$" withString:@""] doubleValue]; 
    } 
    else 
    { 
     tip = [aTextField.text doubleValue]; 
    } 

    if(tip > currentTotal *2) 
    { 
     [self presentViewController:[AppConstant oneButtonDisplayAlert:@"Error" withMessage:@"Please enter valid tip"] animated:YES completion:nil]; 
    } 

    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.tipTF.text = @"$ "; 
} 
+0

whats your currentTotal –

+0

Es 30.00 ist doppelt. – hotspring

+0

konvertieren Double in IntegerValue und überprüfen Sie einmal –

Antwort

3

Die von Ihnen verwendete Methode ist -textView:shouldChangeCharactersInRange:replacement. Die sollte bedeutet, dass die Aktion ausgeführt werden soll, aber noch nicht erledigt werden kann. Wenn Sie den Wert aus dem Textfeld erhalten, erhalten Sie den alten Wert.

Wenn Sie den neuen Wert kennen möchten, müssen Sie den Ersatz in Ihrer Methode selbst ersetzen (eine Kopie des Zeichenfolgenwerts erstellen).

NSString *newValue = [aTextField.text stringByReplacingCharactersInRange:range withString:string]; 
double tip = [newValue doubleValue]; // Where does your var tip comes from? 
+0

Könnten Sie bitte mit Code illustrieren? – hotspring

1
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (textField == self.tipTF) 
    { 
     if (self.tipTF.text && self.tipTF.text.length > 0) { 
      [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
     } 
    } 
    return YES; 
} 

-(void)textFieldDidChange :(UITextField *)theTextField{ 
    NSLog(@"text changed: %@", theTextField.text); 
    double tip; 
    if ([theTextField.text containsString:@"$"]) 
    { 
     tip = [[theTextField.text stringByReplacingOccurrencesOfString:@"$" withString:@""] doubleValue]; 
    }else { 
     tip = [theTextField.text doubleValue]; 
    } 

    if (tip > currentTotal *2) { 
     [self presentViewController:[AppConstant oneButtonDisplayAlert:@"Error" withMessage:@"Please enter valid tip"] animated:YES completion:nil]; 
    } 

} 
+0

Das 'UIControlEventEditingChanged' -Ereignis nicht in der' sentChangeCharactersInRange'-Delegatmethode einrichten. Das ist einfach falsch. Warum sollte man 'addTarget' jedes Mal aufrufen, wenn sich der Wert des Textfelds ändert? – rmaddy

+0

@rmaddy, was schlägst du vor? Die vorgeschlagene Lösung funktioniert 'textFieldDidChange' wird aufgerufen. – hotspring

+0

Richten Sie das Textfeld einmal in viewDidLoad. – rmaddy

Verwandte Themen