5

我想创建一个密码对话,就像你可以在 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。

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

4

2 回答 2

7

好的,所以我自己解决了。隐藏的文本字段是要走的路。即使它是隐藏的,您仍然可以将其设为第一响应者并且键盘会弹出。

所以总结一下:

在 viewDidLoad 中:

[hidden becomeFirstResponder];

然后我监听“Editing 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]];
}

如您所见,当输入第四位数字时,我会发送通知。

于 2009-08-25T07:56:33.810 回答
1

您需要做的是连接四个 UITextField 的“ValueChanged”事件中的每一个的方法,并在该方法中检查发送者的文本长度是否为 0。

您可以将四个 UITextfields 的 ValueChanged 事件挂钩到相同的方法,并像上面所做的那样打开标记。下面的代码可以解决问题。

-(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;
        }
    }
}
于 2009-08-23T20:07:29.273 回答