UItextfield shouldChangeCharactersInRange 方法退格不起作用

Posted

技术标签:

【中文标题】UItextfield shouldChangeCharactersInRange 方法退格不起作用【英文标题】:UItextfield shouldChangeCharactersInRange method backSpace not working 【发布时间】:2014-12-06 06:43:21 【问题描述】:

我实现了这段代码,但退格键不起作用,直到我按下 UITextfield 中的删除按钮 我想用退格键删除。

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

    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:_demo_str];
    for (int i = 0; i < [string length]; i++) 
         unichar c = [string characterAtIndex:i];
         if ([myCharSet characterIsMember:c]) 
            return YES;
      
    
    return NO;
  

【问题讨论】:

当退格键被点击时,string 将是空字符串,所以你返回 NO 这意味着更改将被忽略,所以什么也不会发生。 @rmaddy 那我该怎么做呢? 如果string 为空,则返回YES,以便处理删除。 @rmaddy 不,我不能这样做,因为我指定了一些条件,在该条件下用户只能输入从开始范围到结束范围的特定值 【参考方案1】:

试试这个代码。这对我有用

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

  NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:_demo_str];
  for (int i = 0; i < [string length]; i++) 
     unichar c = [string characterAtIndex:i];
     if ([myCharSet characterIsMember:c]) 
        return YES;
     
     else
     
         return NO;
     
  
   return YES;

【讨论】:

【参考方案2】:

使用此代码:

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString: _demo_str];
if(range.length > 0)
    
    if( !string || [string isEqualToString:@""] || string.length == 0)
          return YES;
    
    else
        for (int i = 0; i < [string length]; i++) 
            unichar c = [string characterAtIndex:i];
            if ([myCharSet characterIsMember:c]) 
                return YES;
            
        
    

     return NO;

else
    for (int i = 0; i < [string length]; i++) 
        unichar c = [string characterAtIndex:i];
        if ([myCharSet characterIsMember:c]) 
            return YES;
        
    
      return NO;

【讨论】:

range.length 在不按退格键的情况下将变为1。当点击退格键时,长度可以不是1。这个答案不起作用。 你能解释一下它不起作用的一种情况吗? 我可以给你两个。 1) 突出显示文本字段中的一个字符并点击一个字母。 range.length1 但没有点击退格键。 2) 突出显示文本字段中的两个或多个字符并点击退格键。 range.length 不会是 1,但退格键被点击了。 换句话说,range.length 与是否按下退格键无关。 您的最新更新仍然是错误的。根本不需要检查range.length。而您过长的if 语句检查string 应该只是if (!string.length)

以上是关于UItextfield shouldChangeCharactersInRange 方法退格不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 操作中将 UITextField 字符串转换为 Double

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

如果添加了新的 UITextField,如何向下移动许多 UITextField

如果 UITextField 已经创建,不要在 Tap 上重新创建 UITextField

使用未声明类型的 UITextfield

猫猫学iOS之UITextField右边设置图片,以及UITextField全解