Похоже, что на самом деле нам нужна строка, состоящая только из цифр, которая всегда имеет длину 7 символов, с крайними левыми символами, заполненными нулями для всего, что пользователь не ввел, верно?
Итак, нам нужно несколько методов, чтобы сделать это как можно проще.
Во-первых, это не имеет смысла прямо сейчас, но нам нужен метод для удаления нулей, которые мы добавили в начале (это будет иметь смысл позже).
Итак, заимствование из этого ответа на переполнение стека...
- (NSString *)stringByRemovingPaddedZeros:(NSString *)string {
NSRange range = [string rangeOfString:@"^0*" options:NSRegularExpressionSearch];
return [string stringByReplacingCharactersInRange:range withString:@""];
}
И мы возьмем ответ Илеша для добавления заполненных нулей:
- (NSString *)stringByAddingPaddedZeros:(NSString *)string padLength:(NSInteger)length {
NSString *padding = [@"" stringByPaddingToLength:(length - string.length) withString:@"0" startingAtIndex:0];
return [NSString stringWithFormat:@"%@%@", padding, string];
}
Итак, теперь мы можем переключаться между заполненными и незаполненными строками, верно?
Итак, теперь последний шаг, реализация shouldChangeCharactersInRange
:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
newString = [self stringByRemovingPaddedZeros:newString];
newString = [self stringByAddedPaddedZeros:newString padLength:7];
textField.text = [newString subStringToIndex:7];
return NO;
}
Здесь мы всегда возвращаем NO
, так как устанавливаем свойство textField.text
вручную. Теперь, когда есть 7 символов (и нет начальных нулей), пользователь не может вводить больше. Если имеется 7 символов и пользователь нажимает клавишу Backspace, все они должны сдвинуться вправо на единицу и добавить ноль к началу. Если впереди есть начальные нули, вводимые символы должны сдвигать все влево и отбрасывать начальные нули, а также добавлять новый символ впереди.
В качестве дополнительного примечания, этот код не проверяет, что пользователь вводит только цифры. Для этого потребуется дополнительная логика. Я бы просто рекомендовал проверить, что replaceString (string
) состоит только из цифр, прежде чем переходить к любому другому коду в shouldChangeCharactersInRange
здесь.
08.07.2015