0

我有 6 个名为 digit1,digit2..etc 的文本字段,直到 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 中输入一个数字时,它不会出现在 digit1 中,但它出现在 digit2 中,并且当我单击删除按钮时,控件会转移到后续文本字段,而不是删除当前文本字段中的文本。请帮助我解决这个问题。

4

3 回答 3

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;
} 
于 2013-08-08T18:44:19.310 回答
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 方法将很快被调用。这不是最干净的解决方案,但它是我能想到的最快的解决方案。

于 2013-08-08T18:55:09.827 回答
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;

} 
于 2013-08-08T18:58:18.653 回答