UItextfields自动对焦

时间:2013-08-08 18:35:37

标签: ios uitextfield resignfirstresponder becomefirstresponder

我有6个文本域名为digit1,digit2..etc upto digit6作为子视图添加到视图上。一旦用户在digit1文本字段中输入数字,我希望digit2文本字段自动聚焦,类似于在digit2文本字段中输入数字时,digit3应自动聚焦。显示的是我试过的代码。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string
{
    if(textField.text.length>=1)
    {
        [textField resignFirstResponder];
        UITextField *_textField=(UITextField*) [self.view viewWithTag:textField.tag+1];
        [_textField becomeFirstResponder];
    }
    return TRUE;
} 

这里发生的事情是当我输入digit1中的数字时,它会出现在数字1中,但它出现在digit2中,当我单击删除按钮时,控件将被转移到后续的文本字段而不是删除当前文本字段中的文本。请帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

假设您有3个文本字段,其名称如t1,t2和t3

设置t1 = 1,t2 = 3和t3 = 3

的标签值

为所有文本字段设置标记值并编写此代码

然后编写此代码

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

switch(textField.tag){
case 1:{
    if(textField.text.length>=1)
    {
        [t1 resignFirstResponder];
        [t2 becomeFirstResponder];
        break;
    }
    }

case 2:{
    if(textField.text.length>=1)
    {
        [t2 resignFirstResponder];
        [t3 becomeFirstResponder];
        break;
    }
    }
case 3:{
    if(textField.text.length>=1)
    {
        [t3 resignFirstResponder];

    break;
    }
    }
}
}
    return TRUE;
} 

答案 1 :(得分:0)

我认为问题是在编辑实际发生之前调用了shouldChangeCharactersInRange。由于您正在更改第一响应者,因此编辑将在新的第一响应者中生效,而不是在旧的第一响应者中生效。

您可以尝试将if块中的代码移动到另一个方法,并使用[self performselector:withObject:afterDelay]调用它,将延迟设置为一些小值。类似的东西:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string
{
    if(textField.text.length>=1)
    {
        [self performSelector:@selector(switchTextField) withObject:nil afterDelay:0.1];
    }
    return TRUE;
}


-(void)switchTextField
{
     [textField resignFirstResponder];
     UITextField *_textField=(UITextField*) [self.view viewWithTag:textField.tag+1];
     [_textField becomeFirstResponder];
}

那样shouldChangeCharactersInRange立即返回true(应该如此),编辑将在当前选中的textField中进行,然后你的switchTextField方法将很快被调用。这不是最干净的解决方案,但它是我能想到的最快的解决方案。

答案 2 :(得分:0)

我找到了解决方案

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

    NSString *str = [textField.text stringByReplacingCharactersInRange:range withString:string];
    if( [str length] > 0 ){
        textField.text = string;
        UIResponder* nextResponder = [textField.superview viewWithTag:(textField.tag + 1)];
        if (nextResponder) {
            [nextResponder becomeFirstResponder];
        }
        return NO;
    }    
    return YES;

}