Перемещение фокуса текстового поля в другое в зависимости от условий - PullRequest
1 голос
/ 05 декабря 2011

У меня есть 10 текстовых полей, каждое из которых может содержать не более одного символа.Когда я ввожу символ в первое текстовое поле, фокус должен автоматически перемещаться в следующее текстовое поле и так далее.То есть, как только первый символ введен в текстовое поле, фокус должен сместиться на следующий.То есть следующее текстовое поле должно стать первым респондентом.Я написал код ниже, использовал метод делегата текстового поля.

- (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-й символ, он вводится в следующем текстовом поле.

Точно так же мне нужно написатьфункция удаления, при которой при удалении текстового поля фокус автоматически перемещается на предыдущее текстовое поле.

Любые ответы будут оценены.Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Вы всегда можете вернуть NO и изменить текст textField вручную.Я думаю, что вам нужно что-то вроде этого.

 - (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;
}
2 голосов
/ 05 декабря 2011

-shouldChangeCharactersInRange вызывается до того, как текстовое поле действительно изменит свой текст.Таким образом, вы получите старое значение в строке.Добавьте строку в начале вашего метода.Это должно исправить вашу проблему.

string = [textField.text stringByReplacingCharactersInRange:range withString:string];
...