根据条件将文本字段的焦点移动到另一个

时间:2011-12-05 13:59:14

标签: iphone ios uitextfield uitextfielddelegate

我有10个文本字段,每个文本字段最多只能容纳一个字符。当我在第一个文本字段中输入字符时,焦点应自动移动到下一个文本字段,依此类推。也就是说,只要在文本字段中输入第一个字符,焦点就应该转移到下一个字符。也就是说,下一个文本字段应该成为第一个响应者。我编写了下面的代码,使用了textfield委托方法。

- (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 个答案:

答案 0 :(得分:2)

-shouldChangeCharactersInRange在文本字段实际更改其文本之前被调用。所以你将获得字符串中的旧值。在方法的开头添加行。它应该解决你的问题。

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

答案 1 :(得分:2)

您始终可以返回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;
}