【问题标题】:how to limit uitextfield character range upto 10 digit如何将 uitextfield 字符范围限制为 10 位
【发布时间】:2015-04-21 05:03:48
【问题描述】:

我只想知道如何限制 uitextfield 范围,即我有一个文本框,我在其中输入 10 位数的值。如果我尝试输入超过 10 位数字,我的文本字段不应接受这些值。非常简单,我只想在文本字段中输入 10 位数字。

我编写了这段代码,但它对我不起作用:

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

NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;

NSUInteger newLength = oldLength - rangeLength + replacementLength;

BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

return newLength <= MAXLENGTH || returnKey;
  }

【问题讨论】:

标签: ios objective-c iphone uitextfield


【解决方案1】:

要限制文本输入的长度,请实现 UITextFieldDelegate 这个方法并在更改后检查文本的长度:

- (BOOL)            textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
            replacementString:(NSString *)string {
    NSString *resultText = [textField.text stringByReplacingCharactersInRange:range
                                                                   withString:string];
    return resultText.length <= 10;
}

【讨论】:

    【解决方案2】:

    在 Swift 3.0 中

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        let charsLimit = 10
    
        let startingLength = textField.text?.characters.count ?? 0
        let lengthToAdd = string.characters.count
        let lengthToReplace =  range.length
        let newLength = startingLength + lengthToAdd - lengthToReplace
    
        return newLength <= charsLimit
    }
    

    【讨论】:

      【解决方案3】:

      试试下面限制为 10 个数字文本的代码。

       - (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
      
              NSInteger length = [textField.text length];
              if (length>9 && ![string isEqualToString:@""]) {
                  return NO;
              }
      
              // This code will provide protection if user copy and paste more then 10 digit text
      
             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 if ([textField.text length]>10) {
                      textField.text = [textField.text substringToIndex:10];
      
                  }
             });
      
      
              return YES;
          }
      

      希望对您有所帮助。

      【讨论】:

      • 检查这个的原因是什么:![string isEqualToString:@""] ?
      • 退格点击后将允许编辑。表示添加 10 位数字后,允许编辑该数字
      • 允许用户粘贴一个大字符串然后裁剪它是很聪明的。可能有用。感谢您的方法。
      【解决方案4】:

      Swift 3 版本

      func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool
          {
              let currentCharacterCount = textField.text?.characters.count ?? 0
              if (range.length + range.location > currentCharacterCount){
                  return false
              }
              let newLength = currentCharacterCount + string.characters.count - range.length
              return newLength <= 10
          }
      

      【讨论】:

        【解决方案5】:

        试试这个。

        -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
        if(range.length + range.location > textField.text.length)
        {
            return NO;
        }
        
        NSUInteger newLength = [textField.text length] + [string length] - range.length;
        return (newLength > 10) ? NO : YES;}
        

        【讨论】:

          【解决方案6】:

          你可以用这个……希望对你有帮助/

             -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
              {
                 int lenght1 = code.text.length - range.length + string.length;
              if (textField.text.length >= 4 && range.length == 0)
                    return NO;
          

          【讨论】:

            【解决方案7】:

            我构建了一个非常好的UITextField 子类来限制输入到字段中的字符数。给你!:

            public class NumberFormattedTextField : UITextField {
                @IBInspectable public var maximumCharacters = 10 {
                     didSet {
                         format()
                    }
                }
            
                public override func awakeFromNib() {
                     format()
                     addTarget(self, action: "format", forControlEvents: .EditingChanged)
                }
            
                func format() {
                     let len = text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
                     // truncate for max characters if needed
                     if len > maximumCharacters {
                         text = text[1...maximumCharacters] // pulls in the last entered character and drops the first one off to preserve length
                     }
                }
            }
            

            这取决于String 的下标。这也是:

            public extension String {
                public subscript (r: Range<Int>) -> String? {
                    let l = self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
                    if r.startIndex <= l && r.endIndex <= l {
                        return substringWithRange(Range(start: advance(startIndex, r.startIndex), end: advance(startIndex, r.endIndex)))
                    } else {
                        return nil
                    }
                }
            }
            

            【讨论】:

              【解决方案8】:

              我已经根据Oxcug 给出的答案构建了一个子类,无需在字符串文件中创建扩展名,并且可以从情节提要和 swift 文件中设置最大字符长度。:

              @IBDesignable class CustomTextField: UITextField {
                  @IBInspectable var maximumCharacters: Int = 80 {
                      didSet {
                          limitCharacters()
                      }
                  }
                  override func awakeFromNib() {
                      super.awakeFromNib()
                      limitCharacters()
                      addTarget(self, action: #selector(CustomTextField.limitCharacters), for: .editingChanged)
                  }
              
                  func limitCharacters() {
                      guard text != nil else {
                          return
                      }
                      if (text?.characters.count)! > maximumCharacters {
                          if let range = text?.index(before: (text?.endIndex)!) {
                              text = text?.substring(to: range)
                          }
                      }
                  }
              }
              

              【讨论】:

                【解决方案9】:

                最佳解决方案:

                func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                        
                        return range.location < 10 //Here 10 is your character limit
                    }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-02-08
                  • 2013-11-30
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多