5

iPhone でオンにできるような PIN コード ダイアログを作成したいと思います。

まだ見ていない方のために説明すると、4 つのボックスと数字キーパッドで構成されています。数字を入力すると、最初のボックスにドットが表示されます。などなど。削除ボタンを押すと、最後のドットが削除されます。

これを 4 つの 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

わかりましたので、自分で解決しました。非表示のテキストフィールドが最適でした。非表示ですが、ファーストレスポンダーにすることでキーボードがポップアップします。

要約すると:

ビューでDidLoad:

[hidden becomeFirstResponder];

次に、「Editing Changed」イベントをリッスンし、4 つの可視 UITextField をそれぞれ 1 文字で更新します。このような:

- (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 の文字数を 4 文字に制限するには、デリゲート メソッド「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]];
}

ご覧のとおり、4 桁目が入力されると通知が送信されます。

于 2009-08-25T07:56:33.810 に答える
1

必要なことは、4 つの UITextField の「ValueChanged」イベントのそれぞれにメソッドを接続し、そのメソッドで送信者のテキストの長さが 0 かどうかを確認することです。

4 つの 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 に答える