【问题标题】:Moving the focus of a textfield to another based on conditions根据条件将文本字段的焦点移动到另一个文本字段
【发布时间】:2011-12-05 13:59:13
【问题描述】:

我有 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;
}

但我没有得到想要的结果。当我输入一个字符时,它在第一个文本字段中输入,但焦点没有转移到下一个,尽管当我输入第二个字符时,它被输入到下一个文本字段中。

同样,我需要编写一个删除函数,这样当我删除一个文本字段时,焦点会自动转移到前一个文本字段。

任何答案将不胜感激。谢谢。

【问题讨论】:

    标签: iphone ios uitextfield uitextfielddelegate


    【解决方案1】:

    您始终可以返回 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】:

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

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

      【讨论】:

      • 没找到你。你能解释一下吗?正如你所说,我已将上述代码添加到我的。但仍然没有正确
      • 问题是在检查 `if([textField.text length] > 0)` textField.text 包含旧值的那一刻,STRING 中的更改尚未应用。因此,如果该字段为空并且您写 sth 这将返回 NO,但是当您再次输入时,已经存在 sth 因此满足条件。注意:这个方法的名字是 SHOULD 所以你告诉系统是否改变值
      • 最好的方法是什么。我还是一头雾水。
      • 问题是,在使用此委托方法时,如果我将下一个文本字段设置为第一响应者,则在该方法返回 YES 之前,我尝试在第一个文本字段中输入的值会被输入在下一个。我只是找不到解决这个问题的另一种方法
      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2019-03-13
      • 2019-02-08
      相关资源
      最近更新 更多