以正确的方式检测UITextField中的退格

Ser*_*yov 6 iphone cocoa-touch objective-c uitextfield ios

注意!这个问题不是这个这个问题的重复!这是一个让事情变得更加清晰的新问题.

所以我已经按照上面帖子的所有说明进行操作,并且UITextField每次用户点击返回按钮时,我都会将其变为空白并移动到新位置.此外,我跟踪textView的输入,并在TextView的位置创建该文本的标签,如下所示:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    if (textField.text.length > 5) {
        CGRect labelFrame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 0, 0);
        UILabel *label = [[UILabel alloc] initWithFrame: labelFrame];
        label.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
        [label setText:textField.text];
        [label setTextColor: [BSFunctions getColorFromHex:@"3f3f3f"]];
        label.backgroundColor =[UIColor lightGrayColor];
        [label sizeToFit];
        [labelsArray addObject:label];
        [self.view addSubview: label];

        CGRect newTextFieldFrame = CGRectMake(labelFrame.origin.x + label.frame.size.width + 5, labelFrame.origin.y, 320, 30);
        NSLog(@"Rect is %@", NSStringFromCGRect(newTextFieldFrame));
        textField.frame = newTextFieldFrame;
        textField.text = @"\u200B";
    }    
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

我设置文本UITextField的文字是@"\u200B",然后我要检测它的退格键是这样的:

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

    if ([string isEqualToString:@""]) {
        NSLog(@"backspace button pressed");

        if (labelsArray.count > 0) {
            UILabel *labelToDelete = [labelsArray lastObject];
            CGRect labelPosition = labelToDelete.frame;
            CGRect oldPosition = textField.frame;
            textField.frame = CGRectMake(labelPosition.origin.x, labelPosition.origin.y, oldPosition.size.width, oldPosition.size.height);
            [labelToDelete removeFromSuperview];
            [labelsArray removeLastObject];
            textField.text = @"\u200B";
        }
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但问题是,它只运行一次然后,即使在textField的开头添加了特殊字符,它也不起作用.可能有什么问题?

小智 6

设定后

textField.text = @"\u200B";
Run Code Online (Sandbox Code Playgroud)

在textField中:shouldChangeCharactersInRange:replacementString:

你必须添加

return NO;
Run Code Online (Sandbox Code Playgroud)

否则它将继续返回YES并用@""替换它,然后当再次按下退格键时,将不会更改任何内容,并且不会调用委托方法.

我可能在这里误解了你的目标,但我希望这会有所帮助.