在文本字段中input时在文本字符之间添加空格

我有一个最大字符范围为16的textfield ,我希望在每4个字符之后加上减号字符或空格,然后写入其他字符,例如5022-2222-2222-2222。 有我的代码,但这是行不通的,怎么能这样做?

 if textField.text?.characters.count == 5 { let l = textField.text?.characters.count let attributedString = NSMutableAttributedString(string: cartNumberTextField.text!) attributedString.addAttribute(NSKernAttributeName, value: CGFloat(4.0), range: NSRange(location: l!, length: 4)) cartNumberTextField.attributedText = attributedString } else if textField.text?.characters.count == 9 { let l = textField.text?.characters.count let attributedString = NSMutableAttributedString(string: cartNumberTextField.text!) attributedString.addAttribute(NSKernAttributeName, value: CGFloat(4.0), range: NSRange(location: l!, length: 4)) cartNumberTextField.attributedText = attributedString } else if textField.text?.characters.count == 13 { let l = textField.text?.characters.count let attributedString = NSMutableAttributedString(string: cartNumberTextField.text!) attributedString.addAttribute(NSKernAttributeName, value: CGFloat(4.0), range: NSRange(location: l!, length: 4)) cartNumberTextField.attributedText = attributedString } 

我将这个代码添加到UITextField shouldChangeCharactersIn范围方法中。

我们可以从oisdk的SwiftSequence实现一个Swift 3版本的chunk(n:)方法 (用于Collection ): SwiftSequence :

 /* Swift 3 version of Github use oisdk:s SwiftSequence's 'chunk' method: https://github.com/oisdk/SwiftSequence/blob/master/Sources/ChunkWindowSplit.swift */ extension Collection { public func chunk(n: IndexDistance) -> [SubSequence] { var res: [SubSequence] = [] var i = startIndex var j: Index while i != endIndex { j = index(i, offsetBy: n, limitedBy: endIndex) ?? endIndex res.append(self[i..<j]) i = j } return res } } 

在这种情况下,实现自定义格式是创build4个字符块并通过“ – ”连接这些元素的简单情况:

 func customStringFormatting(of str: String) -> String { return str.characters.chunk(n: 4) .map{ String($0) }.joined(separator: "-") } 

用法示例:

 print(customStringFormatting(of: "5022222222222222")) // 5022-2222-2222-2222 print(customStringFormatting(of: "50222222222222")) // 5022-2222-2222-22 print(customStringFormatting(of: "5022222")) // 5022-222 

如果应用在UITextFieldDelegatetextField(_:shouldChangeCharactersIn:replacementString:)方法中使用,我们可能想过滤掉customStringFormatting(of:)方法方法中的现有分隔符,并将其作为String扩展来实现:

 extension String { func chunkFormatted(withChunkSize chunkSize: Int = 4, withSeparator separator: Character = "-") -> String { return characters.filter { $0 != separator }.chunk(n: chunkSize) .map{ String($0) }.joined(separator: String(separator)) } } 

并实施文本字段的受控更新,例如:

 let maxNumberOfCharacters = 16 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // only allow numerical characters guard string.characters.flatMap({ Int(String($0)) }).count == string.characters.count else { return false } let text = textField.text ?? "" if string.characters.count == 0 { textField.text = String(text.characters.dropLast()).chunkFormatted() } else { let newText = String((text + string).characters .filter({ $0 != "-" }).prefix(maxNumberOfCharacters)) textField.text = newText.chunkFormatted() } return false } 

上面的最后一部分将截断可能从用户粘贴的string(因为它是全部数字),例如

 // current 1234-1234-123 // user paste: 777777777 /* ^^^^ will not be included due to truncation */ // will result in 1234-1234-1237-7777 

使用shouldChangeCharactersIn就像这样。

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField.text?.characters.count == 4 && string.characters.count != 0 { textField.text = textField.text! + "-" } else if textField.text?.characters.count == 6 && string.characters.count == 0 { textField.text = String(textField.text!.characters.dropLast()) } else if textField.text?.characters.count == 9 && string.characters.count != 0 { textField.text = textField.text! + "-" } else if textField.text?.characters.count == 11 && string.characters.count == 0{ textField.text = String(textField.text!.characters.dropLast()) } else if textField.text?.characters.count == 14 && string.characters.count != 0 { textField.text = textField.text! + "-" } else if textField.text?.characters.count == 16 && string.characters.count == 0 { textField.text = String(textField.text!.characters.dropLast()) } if textField.text?.characters.count == 19 && string.characters.count != 0 { return false } return true } 

注:我已经使用- (Hyphen)你可以简单地用Spacereplace它,如果你想Space而不是- (Hyphen)