2014-09-05 4 views
0

Есть ли способ автоматического форматирования номера телефона? Я хочу, чтобы мой пользователь просто вводил номер и для его форматирования, как (###) - ### - ####, или, по крайней мере, блокировал мою клавиатуру на клавиатуре телефона. Приложение предназначено для внутреннего использования на iPad, поэтому я знаю, что установка клавиатуры на цифровую панель в инспекторе атрибутов не сделает ничего.IOS номер телефона

Я нахожусь на временной сдержанности, поэтому самый эффективный совет времени будет замечательным. Сначала я собирался проверить текстовое поле с регулярным выражением, но разные пользователи ставили цифры, отличные от моих недавних тестов, с небольшой группой в компании. Некоторые помещают ###. ###. ####, некоторые помещают ### ### #### и некоторые put (###) - ### - ####, поэтому это было просто раздражающе.

+0

насчет кодов стран? + 1-123-456-7890 - действительный номер телефона. –

+0

Номера будут только 123-456-7890. Сфера не предназначена для международных номеров – user3443430

+0

См. Также: [Проверка правильности номера телефона IPhone] (http://stackoverflow.com/q/7180847) – Caleb

ответ

0

Я использовал что-то похожее на это с хорошими результатами, и формат будет (###) ### - #### x ### ... Вероятно, это не самый невероятно эффективный процесс , но для всех целей и задач он делает работу довольно хорошо.

Предполагая, что у вас есть переменная property/instance для вашего текстового поля, а также BOOL для отслеживания того, хотите ли вы отформатировать ее, вот как я ее реализовал. Когда я создаю мой TextField за номер телефона, я делаю следующее:

self.textField.keyboardType = UIKeyboardTypeNumberPad; 
self.textField.delegate = self; 
[self.textField addTarget:self action:@selector(formatPhoneNumber) forControlEvents:UIControlEventEditingChanged]; 

выше делает клавиатуру цифровой клавиатуре, и в любое время значение изменяется мы называем formatPhoneNumber, а также убедиться в том, чтобы реализовать UITextFieldDelegateProtocol и задайте себя как делегат поля.

Затем, мы реализуем метод shouldChangeCharactersInRange,

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    // this is what the textField's string will be after changing the characters 
    NSString *resultString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    // flag that we should attempt to format the phone number ONLY if they are adding 
    // characters, otherwise if they are deleting characters we simply want to allow 
    // them to delete them and not format them 
    _shouldAttemptFormat = resultString.length > self.textField.text.length; 

    return YES; 
} 

Способ номер формата телефон будет пытаться форматировать число, если мы определили, что мы должны в методе shouldChangeCharactersInRange, разбивает текущий текст в полезный телефон количество штук, как (555) 444-2222 -> 5554442222, а затем форматирует это красиво:

- (void)formatPhoneNumber { 
    // this value is determined when textField shouldChangeCharactersInRange is called on a phone 
    // number cell - if a user is deleting characters we don't want to try to format it, otherwise 
    // using the current logic below certain deletions will have no effect 
    if (!_shouldAttemptFormat) { 
     return; 
    } 

    // here we are leveraging some of the objective-c NSString functions to help parse and modify 
    // the phone number... first we strip anything that's not a number from the textfield, and then 
    // depending on the current value we append formatting characters to make it pretty 
    NSString *currentString = self.textField.text; 
    NSString *strippedValue = [currentString stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, currentString.length)]; 

    NSString *formattedString; 
    if (strippedValue.length == 0) { 
     formattedString = @""; 
    } 
    else if (strippedValue.length < 3) { 
     formattedString = [NSString stringWithFormat:@"(%@", strippedValue]; 
    } 
    else if (strippedValue.length == 3) { 
     formattedString = [NSString stringWithFormat:@"(%@) ", strippedValue]; 
    } 
    else if (strippedValue.length < 6) { 
     formattedString = [NSString stringWithFormat:@"(%@) %@", [strippedValue substringToIndex:3], [strippedValue substringFromIndex:3]]; 
    } 
    else if (strippedValue.length == 6) { 
     formattedString = [NSString stringWithFormat:@"(%@) %@-", [strippedValue substringToIndex:3], [strippedValue substringFromIndex:3]]; 
    } 
    else if (strippedValue.length <= 10) { 
     formattedString = [NSString stringWithFormat:@"(%@) %@-%@", [strippedValue substringToIndex:3], [strippedValue substringWithRange:NSMakeRange(3, 3)], [strippedValue substringFromIndex:6]]; 
    } 
    else if (strippedValue.length >= 11) { 
     formattedString = [NSString stringWithFormat:@"(%@) %@-%@ x%@", [strippedValue substringToIndex:3], [strippedValue substringWithRange:NSMakeRange(3, 3)], [strippedValue substringWithRange:NSMakeRange(6, 4)], [strippedValue substringFromIndex:10]]; 
    } 

    self.textField.text = formattedString; 
} 

Вот видео его в действии прямо сейчас:

https://www.dropbox.com/s/xq9vb9p62oamova/phone.mov?dl=0

Я использую что-то подобное в своем проекте с открытым исходным кодом, который обрабатывает формы iOS, если вы хотите ссылаться на другой код, связанный с этим. Первая ссылка на gif с демо, чтобы вы могли видеть ее в действии.

https://raw.githubusercontent.com/mamaral/MAFormViewController/master/Screenshots/form_demo.gif https://github.com/mamaral/MAFormViewController

+0

Удивительный! качественный товар. Вы нашли способ удалить, кажется, застряли после the) и - в формате. – user3443430

+0

Действительно? Позвольте мне проверить, что это не должно, но я сделал копию и вставлял некоторые изменения здесь, чтобы я мог что-то упустить. – Mike

+0

Ahh да дайте мне сделать несколько дополнений .. – Mike