2009-08-23 4 views
5

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

見たことのない人には、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がすでに空のときにdeleteキーが通知を生成しないことです。だから私は以前のUITextFieldに移動する方法がありません。

誰もこの問題を解決する方法のより良い甘さを持っていますか?私は隠されたテキストフィールドを考えています...?あなたがする必要がどのような

答えて

7

OK、私はそれを自分で解決しました。隠されたテキストフィールドは、行く方法でした。たとえそれが隠されていても、最初の応答者にすることができ、キーボードがポップアップします。

だから、要約する:のviewDidLoadで

[hidden becomeFirstResponder]; 

そして、私は、「編集変更」イベントをリッスンし、1文字ごとで4つの見えるの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 = @""; 
} 

は4つの文字に隠されたの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]]; 
} 

をそして、あなたが見ることができるように私は、通知の送信します4桁目が入力されました。

1

は、送信者のテキストの長さは、あなたがのためにValueChangedイベントをフックすることができます0

であるかどうかを確認するために4 UITextFieldの「にValueChanged」イベントのそれぞれのアップとそのメソッドのチェック方法をフックです4つのUITextfieldを同じ方法で使用し、上記のようにタグをオンにします。次のコードはこのトリックを行います。

-(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