设置TextField焦点文本删除

时间:2013-08-12 05:46:54

标签: ios objective-c uitextfield

我有四个文本域。允许用户在每个文本字段中仅输入一个数字。一旦用户输入单个数字,其焦点应该在下一个文本字段上。我做了这个部分,工作正常。现在,我想要的是当我从文本字段中删除文本时,它的焦点应该移动到上一个文本字段。我的意思是,如果我从第四个文本字段中删除文本(数字),则其焦点应移至第三个文本字段。简而言之,删除文本时,重点应放在以前的文本字段上。

现在,我的问题是当我从文本字段中删除文本然后它的焦点移动到上一个文本字段但它清除了该文本字段的文本(我设置了焦点的文本字段)。我想要的是文本不应该在焦点上删除。

in .h file

IBOutlet UITextField *txtPinDigit1;
    IBOutlet UITextField *txtPinDigit2;
    IBOutlet UITextField *txtPinDigit3;
    IBOutlet UITextField *txtPinDigit4;
     UITextField *currentTextField;

in .m file

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if(textField.tag==0)
    {
        currentTextField=txtPinDigit1;
    }
    else if(textField.tag==1)
    {
        currentTextField=txtPinDigit2;
    }
    else if(textField.tag==2)
    {
        currentTextField=txtPinDigit3;
        if(isDelete)
        {
            textField.text=digit3;
        }
    }
    else if(textField.tag==3)
    {
        currentTextField=txtPinDigit4;
    }

    return YES;
}


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

    if(([textField.text length]==1)&&(![string isEqualToString:@""]))
    {
        if(currentTextField==txtPinDigit1)
        {
            [txtPinDigit2 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit2)
        {
            [txtPinDigit3 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit3)
        {
            [txtPinDigit4 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit4)
        {
            textField.text = [textField.text substringToIndex:MAXLENGTH-1];
            //[txtPinDigit4 resignFirstResponder];
            //[txtPinDigit1 becomeFirstResponder];
        }
    }
    else if([string isEqualToString:@""])
    {
        isDelete=YES;
        NSLog(@"replacementString:%@",string);
       // textField.text=string;
        if(currentTextField==txtPinDigit4)
        {
            textField.text=string;
            digit3=nil;
            [digit3 release];
            digit3=[[NSString alloc] initWithFormat:@"%i",[txtPinDigit3.text intValue]];

            [txtPinDigit3 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit3)
        {
            textField.text=string;
            [txtPinDigit2 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit2)
        {
            textField.text=string;
            [txtPinDigit1 becomeFirstResponder];
        }
        else if(currentTextField==txtPinDigit1)
        {
            textField.text=string;
           // [txtPinDigit1 resignFirstResponder];
            //[txtPinDigit1 becomeFirstResponder];
        }
    }

    return YES;
}

在上面的代码中定义了MAXLENGTH = 1。

任何帮助将不胜感激。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

尝试此代码,更改shouldChangeCharactersInRange:Delegate Method

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

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

    if ([newString length] < 1) 
    {

        if (textField.tag==2)
        {
            [txtPinDigit1 performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
            //            txt2.text=@"";
        }
        else if (textField.tag==3)
        {

            [txtPinDigit2 performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
        }
        else if (textField.tag==4)
        {
            [txtPinDigit3 performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];

        }
        return YES;
    } else
    {
        // Otherwise we cut the length of newString to 1 (if needed) and set it to the textField.
        textField.text = [newString length] > 1 ? [newString substringToIndex:1] : newString;

        if (textField.tag==1)
        {
            [textField resignFirstResponder];
            [txtPinDigit2 becomeFirstResponder];
        }
        else if (textField.tag==2)
        {
            [textField resignFirstResponder];
            [txtPinDigit3 becomeFirstResponder];
        }
        else if (textField.tag==3)
        {
            [textField resignFirstResponder];
            [txtPinDigit4 becomeFirstResponder];
        }
        return NO;
    }


}

答案 1 :(得分:0)

检查以这种方式检查长度,并在shouldChangeCharactersInRange

的开头加上一个断点
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
       int length = textField.text.length - range.length + string.length;

       return YES;
}

我希望它会对你有所帮助。

答案 2 :(得分:0)

在调用填写第1位数字之前成为第一响应者之前,绑定输入的文本输入&amp;响应者进入字典...

在每个上一个/下一个条件下,从字典中检索信息...下面的示例代码用于一般的上一个/下一个自定义操作(虽然不是自动)..您只需要根据一点改变逻辑你喜欢的条件......

- (NSArray *) responders
{
    if (_responders)
        return _responders;

    NSArray *textInputs = EditableTextInputsInView([[UIApplication sharedApplication] keyWindow]);
    return [textInputs sortedArrayUsingComparator:^NSComparisonResult(UIView *textInput1, UIView *textInput2) {
        UIView *commonAncestorView = textInput1.superview;
        while (commonAncestorView && ![textInput2 isDescendantOfView:commonAncestorView])
            commonAncestorView = commonAncestorView.superview;

        CGRect frame1 = [textInput1 convertRect:textInput1.bounds toView:commonAncestorView];
        CGRect frame2 = [textInput2 convertRect:textInput2.bounds toView:commonAncestorView];
        return [@(CGRectGetMinY(frame1)) compare:@(CGRectGetMinY(frame2))];
    }];
}

在执行上一个/下一个自动选项卡之前,应调用以下函数。

- (Void) selectAdjacentResponder: (UISegmentedControl *) sender
{
    NSArray *firstResponders = [self.responders filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIResponder *responder, NSDictionary *bindings) {
        return [responder isFirstResponder];
    }]];
    NSLog(@"%@",firstResponders);


    UIResponder *firstResponder = [firstResponders lastObject];
    NSInteger offset = sender.selectedSegmentIndex == 0 ? -1 : +1;
    NSInteger firstResponderIndex = [self.responders indexOfObject:firstResponder];

    NSInteger adjacentResponderIndex = firstResponderIndex != NSNotFound ? firstResponderIndex + offset : NSNotFound;
    UIResponder *adjacentResponder = nil;
    if (adjacentResponderIndex >= 0 && adjacentResponderIndex < (NSInteger)[self.responders count])
        adjacentResponder = [self.responders objectAtIndex:adjacentResponderIndex];

    [adjacentResponder becomeFirstResponder];
}

比特更长,但这就是我所知道的BIT :) ..快乐的编码...