条件に基づいてテキストフィールドの焦点を別のテキストフィールドに移動する

StackOverflow https://stackoverflow.com/questions/8386401

質問

私は10個のテキストフィールドを持っていますが、それぞれがせいぜい1文字を保持できます。最初のテキストフィールドに文字を入力すると、フォーカスは次のテキストフィールドなどに自動的に移動する必要があります。つまり、最初のキャラクターがテキストフィールドに入力されるとすぐに、次のキャラクターに焦点が移動するはずです。つまり、次のテキストフィールドは最初の応答者になるはずです。以下のコードを書き、Textfield Delegateメソッドを使用しました。

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

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];

for (int i = 0; i < [string length]; i++) {
    unichar c = [string characterAtIndex:i];
    if([myCharSet characterIsMember:c])
    {
        int previousTag = textField.tag;


        if([textField.text length] > 0)
        {
            if((previousTag == 9) && ([textField10.text length] >0))
            {
                return NO;
            }
            UITextField *tempField=(UITextField *)[self.view viewWithTag:previousTag+1]; 
            if([tempField.text length] > 0){
                [tempField resignFirstResponder];
                return NO;
            }
            [tempField becomeFirstResponder];
            return YES;
        }

    }
    else{
        return NO;
    }
}


return YES;
}

しかし、私は望ましい結果を得ていません。私が文字を入力すると、最初のテキストフィールドに入力されましたが、2番目の文字を入力すると次のテキストフィールドに入力されますが、フォーカスは次のテキストに移動しません。

同様に、テキストフィールドを削除すると、フォーカスが前のテキストフィールドに自動的にシフトするように、削除関数を記述する必要があります。

どんな答えも感謝しています。ありがとう。

役に立ちましたか?

解決

いつでもNOを返して、テキストフィールドテキストを手動で変更できます。あなたが必要とするのはこのようなものだと思います。

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

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
int previousTag = textField.tag;

if ([string isEqualToString:@""]) {//backspace button
    if (previousTag==0) {//added to prevent crashing in first tf
        return YES;
    }
  UITextField *tempField2=(UITextField *)[self.view viewWithTag:previousTag-1]; 

    textField.text=string;
    [tempField2 becomeFirstResponder];
    return NO;

}
for (int i = 0; i < [string length]; i++) {
    unichar c = [string characterAtIndex:i];
    if([myCharSet characterIsMember:c])
    {
        if((previousTag == 9) && ([textField10.text length] >0))
        {
            return NO;
        }

        UITextField *tempField=(UITextField *)[self.view viewWithTag:previousTag+1]; 
        if([tempField.text length] > 0)
        { 
            textField.text=string;
            [tempField resignFirstResponder];
            return NO;
        }
        textField.text=string;
        [tempField becomeFirstResponder];
        return NO;

    }
    else{
        return NO;
    }


}


return YES;
}

他のヒント

-SouldChangeCharacterSinrangeは、テキストフィールドが実際にテキストを変更する前に呼び出されます。したがって、文字列の古い値を取得します。メソッドの先頭に行を追加します。問題を解決する必要があります。

string = [textField.text stringByReplacingCharactersInRange:range withString:string];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top