2

最大数が 1 かどうかを確認するコードは、そのコードのみを使用する場合に機能します。しかし、[becomFirstResponder] で次の UITextField への自動ジャンプを追加すると、機能しなくなりました。

どうもありがとう!

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

いつ

MyViewController.h

@interface GateKeeperViewController : UIViewController <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *firstCodeField;
@property (strong, nonatomic) IBOutlet UITextField *secondCodeField;
@property (strong, nonatomic) IBOutlet UITextField *thirdCodeField;
@property (strong, nonatomic) IBOutlet UITextField *fourthCodeField;
@property (strong, nonatomic) IBOutlet UITextField *fifthCodeField;

MyViewController.m

@synthesize firstCodeField;
@synthesize secondCodeField;
@synthesize thirdCodeField;
@synthesize fourthCodeField;
@synthesize fifthCodeField;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self initFieldListeners];
}

-(void) initFieldListeners {

    firstCodeField.delegate = self;
    secondCodeField.delegate = self;
    thirdCodeField.delegate = self;
    fourthCodeField.delegate = self;
    fifthCodeField.delegate = self;

    [self.firstCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.secondCodeField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

    [self.thirdCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.fourthCodeField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

    [self.fifthCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];
}

- (void)textFieldEditing:(UITextField *)textField
{
    if(textField == self.firstCodeField ){
        if ([self.firstCodeField.text length] == 1) {
            [self.secondCodeField becomeFirstResponder];
        }
    }

    if(textField == self.secondCodeField ){
        if ([self.secondCodeField.text length] == 1) {
            [self.thirdCodeField becomeFirstResponder];
        }
    }

    if(textField == self.thirdCodeField ){
        if ([self.thirdCodeField.text length] == 1) {
            [self.fourthCodeField becomeFirstResponder];
        }
    }

    if(textField == self.fourthCodeField ){
        if ([self.fourthCodeField.text length] == 1) {
            [self.fifthCodeField becomeFirstResponder];
        }
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 1) ? NO : YES;

}
4

3 に答える 3

2

target-actionテキストフィールドで使用して、編集イベントの通知を受け取る、少し異なる解決策をお勧めします。アイデアは、shouldChangeCharactersInRangeメソッドの後にアクションが実行されるということです。たとえば、3 つのテキストフィールドを使用する場合:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.firstTextField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.secondTextField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

}

- (void)textFieldEditing:(UITextField *)textField
{
    if(textField == self.firstTextField ){
        if ([self.firstTextField.text length] == 1) {
            [self.secondTextField becomeFirstResponder];
        }
    }

    if(textField == self.secondTextField ){
        if ([self.secondTextField.text length] == 1) {
            [self.thirdTextField becomeFirstResponder];
        }
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 1) ? NO : YES;

}

このコードにはまだいくつかの改善点がありますが、これで作業を開始できます。

于 2014-05-31T12:08:24.630 に答える
0

- setText: メソッドを削除して、このようにします

最後の NSString と現在の UITextField の参照を保持するローカル変数を作成します

[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(giveText:) userInfo:nil repeats:NO]; // instead of your - setText:

- (void)giveText:(id)sender {

    // set your text here lets say

    [currentTextField setText:lastString];
}

returnステートメントの後にテキストを設定する必要がありますが、NSTimerを悪用してそれを行うことは不可能です。

例:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    _lastString = string;
    _currentTextField = textField;

    if(firstCodeField == textField){

        // [firstCodeField setText:newString];

        [secondCodeField becomeFirstResponder];
    }

    // ...... other ifs

    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(giveText:) userInfo:nil repeats:NO];
}
于 2014-05-31T12:17:11.737 に答える