Создание диалога пин-кода - PullRequest
       13

Создание диалога пин-кода

5 голосов
/ 23 августа 2009

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

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

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

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

Метод 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.

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

Ответы [ 2 ]

7 голосов
/ 25 августа 2009

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

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

В viewDidLoad:

[hidden becomeFirstResponder];

А потом я прослушиваю событие «Редактирование изменено» и обновляю четыре видимых 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 голос
/ 24 августа 2009

Что вам нужно сделать, это подключить метод каждого из четырех событий ValueChanged UITextField и в этом методе проверить, равна ли длина текста отправителя 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...