创建pin码对话

Kob*_*ski 5 iphone uitextfield

我想创建一个pin-code对话框,就像你可以在iPhone上打开一样.

对于那些没有看过它的人,它由四个盒子和一个数字键盘组成.输入数字时,第一个框中会出现一个点.等等.当您点击删除按钮时,最后一个点被删除.

我把它设置为四个UITextFields,在我的代表中我听:

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这实际上有效,但问题是当UITextField已经为空时,删除键不会产生任何通知.所以我无法移动到之前的UITextField.

那么有没有人更好地解决如何解决这个问题.我在想隐藏的文本字段......?

Kob*_*ski 7

好的,所以我自己解决了.隐藏的文本域是要走的路.即使它是隐藏的,你仍然可以使它成为第一个响应者,键盘将弹出.

总结一下:

在viewDidLoad中:

[hidden becomeFirstResponder];
Run Code Online (Sandbox Code Playgroud)

然后我监听"编辑已更改"事件并更新四个可见的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 = @""; 
}
Run Code Online (Sandbox Code Playgroud)

要将隐藏的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]];
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在输入第四个数字时发送通知.