2016-04-21 9 views
0

Meine Klasse ist als das Textfeld ein Delegierter registriert, und einen Teil seiner Funktion beinhaltet die Umsetzung textfield: shouldChangeCharactersInRange: wie diese replacementString:iOS app Absturz auf UITextFieldDelegateMethod diakritischen von Hardware-Tastatur eingeben

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    self.stateHolder.fieldValue = [self.stateHolder.fieldValue stringByReplacingCharactersInRange:range withString:string]; 

    return YES; 
} 

Ich begann einen Absturz zu bemerken wenn Sie diakritische Zeichen von der Hardware-Tastatur in ein leeres Textfeld eingeben. Hier ist der Fehler ich sehe:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds' 

Es scheint, dass, wenn von einer Hardware-Tastatur die diakritischen Eingabe des Bereichs, der es mit der Eingabe verbunden ist, ist „location = 1, Länge = 0“. Dies ist der Grund dafür, dass beim Versuch, sie in der Zeichenfolge zu speichern, eine Ausnahmebedingung ausgelöst wird. Kennt jemand einen Weg um diesen Unfall herum?

+0

warum u stringByReplacingCharactersInRange Sie sich auch was tut self.stateHolder.fieldValue zu halten? –

+0

Der Feldwert ist nur eine Zeichenfolge. Und ich benutze "String ByReplacingCharacters ...", weil es einfach ist, dieses Feld auf dem neuesten Stand zu halten. – Chris

+0

Die Länge des fieldValue sollte größer oder gleich der Länge der Ersatzzeichenfolge sein. –

Antwort

0

Die Länge des fieldValue sollte größer oder gleich der Länge der Ersatzzeichenfolge sein, da sonst die Zeichen nicht ausreichen.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
     if(self.stateHolder.fieldValue.length>=string.length){ 
    self.stateHolder.fieldValue = [self.stateHolder.fieldValue stringByReplacingCharactersInRange:range withString:string]; 
    } 

    return YES; 
} 

Zum Beispiel:

  fieldValue= @"Hello"; length=5 
      [email protected]"'"; length=1  1 can be replaced in 5 

       fieldValue= @""; length=0 length 0 or nil, 
      [email protected]"'"; length=1 , but not 1 can be replaced in 0 
+0

Während das das ursprüngliche Problem löst, glaube ich, dass es die Pandora-Box geöffnet hat. Ich bin in der Lage, die diakritische Eingabe, aber dann Rückschritt auf es verursacht die gleiche Art von Fehler. Es scheint, dass die Bedingung, die Sie hinzugefügt haben, das Problem umgangen hat, indem Sie das Zeichen einfach nicht in die Zeichenfolge "fieldValue" eingefügt haben. Daher hat das Zurücksetzen dazu geführt, dass ein Bereich in einer leeren Zeichenfolge ersetzt wurde. – Chris

+0

können Sie die Rücktaste erkennen und ignorieren.Für das Erkennen der Rücktaste: http://StackOverflow.com/questions/25371254/how-to-detect-delete-key-on-an-uitextfield-in-ios-8 –

+0

Eigentlich wenn Wenn Sie zuerst ein Symbol eingeben und dann die Rücktaste (Löschen) drücken, sollte dies nicht zum Absturz führen, da Sie versuchen, nichts zu ersetzen. –