2009-08-23 7 views
5

Я хотел бы создать диалог с пин-кодом, например, тот, который вы можете включить на iPhone.Создание диалога с PIN-кодом

Для тех, кто этого не видел, он состоит из четырех ящиков и цифровой клавиатуры. Когда вы вводите цифру, в первом поле появляется точка. И так далее. Когда вы нажмете кнопку удаления, последняя точка будет удалена.

я это настроить как четыре UITextFields и в моем делегатом я слушаю:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    [self performSelector:@selector(pickNext:) withObject:textField afterDelay:0.0]; 
    return YES; 
} 

The pickNext: метод перехода к следующему UITextField, как это:

- (void)pickNext:(UITextField*)textField 
{ 
    switch ([textField tag]) { 
    case 1: 
     [pin2 becomeFirstResponder]; 
     break; 
    case 2: 
     [pin3 becomeFirstResponder]; 
     break; 
    case 3: 
     [pin4 becomeFirstResponder]; 
     break; 
    case 4: 
     [textField resignFirstResponder]; 
     break; 
    default: 
     break; 
    } 
} 

Это на самом деле работает, но проблема для меня заключается в том, что ключ удаления не вызывает уведомления, когда UITextField уже пуст. Поэтому у меня нет возможности перейти к предыдущему UITextField.

У кого-нибудь есть лучшее решение, как решить эту проблему. Я думаю, скрытое текстовое поле ... ??

ответ

7

ОК, поэтому я решил это сам. Скрытое текстовое поле было способом пойти. Несмотря на то, что он скрыт, вы все равно можете сделать его первым ответчиком, и клавиатура появится.

Итак, подведем итог:

В viewDidLoad:

[hidden becomeFirstResponder]; 

А потом я слушаю на «Редактирование Changed» событие и обновить четыре видимых UITextField с одного символа в каждой. Как это:

- (IBAction)textChanged:(UITextField*)hiddenField 
{ 
    NSString *hiddenText = hiddenField.text; 

    [self setOneTextField:pin1 toString:hiddenText atIndex:0]; 
    [self setOneTextField:pin2 toString:hiddenText atIndex:1]; 
    [self setOneTextField:pin3 toString:hiddenText atIndex:2]; 
    [self setOneTextField:pin4 toString:hiddenText atIndex:3]; 
} 

- (void)setOneTextField:(UITextField*)textField toString:(NSString*)string atIndex:(NSInteger)index 
{ 
    if ([string length] > index) 
    textField.text = [string substringWithRange:NSMakeRange(index, 1)]; 
    else 
    textField.text = @""; 
} 

Чтобы ограничить количество символов в скрытом UITextField четырех персонажей, которых я реализовать делегат метода «shouldChangeCharactersInRange»:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    bool okToEdit = YES; 

    if (range.location > 3) 
    { 
    okToEdit = NO; 
    } else if (range.location == 3) { 
    [self performSelector:@selector(sendPinCodeNotification) withObject:nil afterDelay:0.0]; 
    } 
    return okToEdit; 
} 

- (void)sendPinCodeNotification 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:PINCODE_NOTIFICATION object:[NSString stringWithFormat:@"%@%@%@%@", pin1.text, pin2.text, pin3.text, pin4.text]]; 
} 

И как вы можете видеть, что я отправить уведомление, когда введена четвертая цифра.

1

Что вам нужно сделать, это крючок метод до каждого события в четырех UITextField в «ValueChanged» и в этом метод проверки, чтобы увидеть, если длина текста отправителя 0.

Вы можете подключить ValueChanged событие для четыре поля UIText до того же метода и включить тег, как вы делаете выше. Следующий трюк сделает этот трюк.

-(IBAction) pinChanged: (id)sender { 

    UITextField *currentField = (UITextField*) sender; 

    // if the field thqt has just been changed is blank 
    if ([currentField.text length] == 0) { 

     // switch on the fields tag, and go to the previous field 
     switch (currentField.tag) { 
      case 1: 
       // in first field already, stay here! 
       break; 
      case 2: 
       // go back to previous field 
       [pin1 becomeFirstResponder]; 
       break; 
      case 3: 
       // go back to previous field 
       [pin2 becomeFirstResponder]; 
       break; 
      case 4: 
       // go back to previous field 
       [pin3 becomeFirstResponder]; 
       break; 
      default: 
       break; 
     } 
    } 
} 
+0

Ну, ValueChanged, по-видимому, ничего не делает для UITextField, по крайней мере, я не получаю никаких событий. Но «Редактирование изменено» отправляет события, но опять же, а не когда поле пустое, и я нажимаю клавишу «Удалить». – Kobski

 Смежные вопросы

  • Нет связанных вопросов^_^