【问题标题】:UItextfield shouldChangeCharactersInRange method backSpace not workingUItextfield shouldChangeCharactersInRange 方法退格不起作用
【发布时间】: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 不,我不能这样做,因为我指定了一些条件,在该条件下用户只能输入从开始范围到结束范围的特定值

标签: ios objective-c ios8 uitextfield uitextfielddelegate


【解决方案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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多