条件に基づいてテキストフィールドの焦点を別のテキストフィールドに移動する
-
28-10-2019 - |
質問
私は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];
所属していません StackOverflow