2016-07-27 55 views
0

在文本字段中,我只想要允许16个字符。我不想输入超过16个字符。这是我的代码;
Swift中的UITextfield字符数限制

let currentCharacterCount = txtPinNo.text?.characters.count ?? 0 
    if (range.length + range.location > currentCharacterCount){ 
     return false 
    } 
    let newLength = currentCharacterCount + string.characters.count - range.length 
    return newLength <= 19 

我的预期的结果是 - >1234-1111-3333-6666(19个字符)
我的实际结果的结果是 - > 1234-1111-2222-4444- (最后一个数字总是出现,只是想删除“-4”)

我不希望允许输入超过16个字符。请帮助我如何检查它。

+2

可能重复[设置UITextField的最大字符长度](http://stackoverflow.com/questions/433337/set-the-maximum-character-length-of-a-uitextfield) – ebby94

+0

谢谢。我会尝试。 :) –

回答

1

你也可以继承的UITextField和创建自定义字段如下:

@IBDesignable 
class LimitedLengthField: UITextField { 
    @IBInspectable var maxLength: Int = 16 // set maximum number of characters 
    var stringValue: String { return text ?? "" } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     keyboardType = .ASCIICapable // set the keyboard type 
     addTarget(self, action: #selector(editingChanged), forControlEvents: .EditingChanged) 
     editingChanged(self) 
    } 
    func editingChanged(sender: UITextField) { 
     sender.text = String(stringValue.characters.prefix(maxLength)) 
    } 
} 

如果您需要广告的一些自定义格式它会得到一点点,但棘手:

斯威夫特2

class CustomField: UITextField { 
    var stringValue: String { return text ?? "" } 
    var decimalDigits: String { 
     return stringValue 
      .componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) 
      .joinWithSeparator("") ?? "" 
    } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     addTarget(self, action: #selector(editindChanged(_:)), forControlEvents: .EditingChanged) 
     keyboardType = .NumberPad 
     editindChanged(self) 
    } 
    func editindChanged(sender: UITextField) { 
     let letters = Array(decimalDigits.stringByPaddingToLength(16, withString: " ", startingAtIndex: 0).characters) 
     switch decimalDigits.characters.count { 
     case 1...4: 
      text = decimalDigits 
     case 5...8: 
      text = (String(letters[0...3]) + "-" 
       + String(letters[4...7])) 
       .stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
     case 9...12: 
      text = (String(letters[ 0...3 ]) + "-" 
       + String(letters[ 4...7 ]) + "-" 
       + String(letters[8...11])) 
       .stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
     case 13...16: 
      text = (String(letters[ 0...3 ]) + "-" 
       + String(letters[ 4...7 ]) + "-" 
       + String(letters[8...11]) + "-" 
       + String(letters[12...15])) 
       .stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
     default: 
      print(text) 
      if decimalDigits.characters.count > 0 { 
       text = String(text!.characters.prefix(19)) 
      } 
     } 
    } 
} 

斯威夫特3

class CustomField: UITextField { 
    var stringValue: String { return text ?? "" } 
    var decimalDigits: String { 
     return stringValue 
      .components(separatedBy: CharacterSet.decimalDigits.inverted) 
      .joined(separator: "") ?? "" 
    } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     addTarget(self, action: #selector(editindChanged(_:)), for: .editingChanged) 
     keyboardType = .numberPad 
     editindChanged(self) 
    } 
    func editindChanged(_ sender: UITextField) { 
     let letters = Array(decimalDigits.padding(toLength: 16, withPad: " ", startingAt: 0).characters) 
     switch decimalDigits.characters.count { 
     case 1...4: 
      text = decimalDigits 
     case 5...8: 
      text = (String(letters[0...3]) + "-" 
        + String(letters[4...7])) 
        .trimmingCharacters(in: .whitespaces) 
     case 9...12: 
      text = (String(letters[ 0...3 ]) + "-" 
        + String(letters[ 4...7 ]) + "-" 
        + String(letters[8...11])) 
        .trimmingCharacters(in:. whitespaces) 
     case 13...16: 
      text = (String(letters[ 0...3 ]) + "-" 
       + String(letters[ 4...7 ]) + "-" 
       + String(letters[8...11]) + "-" 
       + String(letters[12...15])) 
       .trimmingCharacters(in: .whitespaces) 
     default: 
      print(text) 
      if decimalDigits.characters.count > 0 { 
       text = String(text!.characters.prefix(19)) 
      } 
     } 
    } 
} 
+0

Swift 2 https://www.dropbox.com/s/x6e6tw436yn4xs0/CustomField.zip?dl=1 –

+0

Swift 3 https://www.dropbox.com/s/tdmotmpzfa3cd94/CustomField.zip?dl=1 –