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

Posted

技术标签:

【中文标题】以正确的方式检测 UITextField 中的退格【英文标题】:Detecting backspace in UITextField the right way 【发布时间】:2013-02-08 12:05:00 【问题描述】:

注意!这个问题不是this 或this 问题的重复!这是一个让事情更清楚的新问题。

因此,我已按照上述帖子的所有说明进行操作,并且每次用户点击返回按钮时,我都会将这个 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;

我将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;

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

【问题讨论】:

【参考方案1】:

设置后

textField.text = @"\u200B";

在 textField:shouldChangeCharactersInRange:replacementString:

你必须添加

return NO;

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

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

【讨论】:

以上是关于以正确的方式检测 UITextField 中的退格的主要内容,如果未能解决你的问题,请参考以下文章

Android:WebView/BaseInputConnection 中的退格键

哪个委托方法将调用单击键盘中的退格按钮

访问表单中的退格删除所有记录

js禁用firefox中的退格功能

JavaScript 侦听器,“按键”不检测退格?

iOS 6 UITextField Secure - 如何检测退格清除所有字符?