diff --git a/Signal/src/view controllers/RegisterViewController.m b/Signal/src/view controllers/RegisterViewController.m index d4248e547..fd9cdb580 100644 --- a/Signal/src/view controllers/RegisterViewController.m +++ b/Signal/src/view controllers/RegisterViewController.m @@ -381,7 +381,7 @@ #pragma mark - UITextFieldDelegate -- (NSUInteger) recalculateLocation:(NSUInteger)location { +- (NSUInteger) calculateLocationOffset:(NSUInteger)location { uint offset = 0, phonenumberposition = 0; for (uint i=0;i<location;i++) { if ([_phoneNumberTextField.text characterAtIndex:i] != [_enteredPhoneNumber characterAtIndex:phonenumberposition]) @@ -395,20 +395,32 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { - - range.location -= [self recalculateLocation:range.location]; + uint offset = [self calculateLocationOffset:range.location]; + unsigned short currentPosCharacter = 0; + range.location -= offset; BOOL handleBackspace = range.length == 1; if (handleBackspace) { + if ((range.location + offset) < _phoneNumberTextField.text.length) + currentPosCharacter = [_phoneNumberTextField.text characterAtIndex:(range.location + offset)]; + + if (currentPosCharacter < '0' || currentPosCharacter > '9') + range.location --; NSRange backspaceRange = NSMakeRange(range.location, 1); [_enteredPhoneNumber replaceCharactersInRange:backspaceRange withString:string]; + range.location ++; } else { NSString* sanitizedString = [[string componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet ] invertedSet]] componentsJoinedByString:@""]; NSMutableString* mutablePhoneNumber = [NSMutableString stringWithString:_enteredPhoneNumber]; [mutablePhoneNumber insertString:sanitizedString atIndex:range.location]; _enteredPhoneNumber = mutablePhoneNumber; + if ((range.location + offset +1) < _phoneNumberTextField.text.length) + currentPosCharacter = [_phoneNumberTextField.text characterAtIndex:(range.location + offset +1)]; + + if ((currentPosCharacter < '0' || currentPosCharacter > '9') && currentPosCharacter != 0) + range.location++; } - [self updatePhoneNumberFieldWithString:_enteredPhoneNumber cursorposition:range.location+1]; + [self updatePhoneNumberFieldWithString:_enteredPhoneNumber cursorposition:range.location+offset]; return NO; } @@ -416,7 +428,11 @@ cursorposition:(NSUInteger)cursorpos { NSString* result = [PhoneNumber bestEffortFormatPartialUserSpecifiedTextToLookLikeAPhoneNumber:_enteredPhoneNumber withSpecifiedCountryCodeString:_countryCodeLabel.text]; + cursorpos += result.length - _phoneNumberTextField.text.length; _phoneNumberTextField.text = result; + UITextPosition *position = [_phoneNumberTextField positionFromPosition:[_phoneNumberTextField beginningOfDocument] + offset:(NSInteger)cursorpos]; + [_phoneNumberTextField setSelectedTextRange:[_phoneNumberTextField textRangeFromPosition:position toPosition:position]]; } @end