在输入文本字段时在文本字段字符之间添加空格

我有一个textfield最大字符范围为16的字符,每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

}

我在UITextFieldshouldChangeCharactersIn范围方法中添加此代码。

回答:

我们可以从实现oisdk:s SwiftSequence

chunk(n:)方法的(版本号)的Swift

3版本开始:Collection

/* 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

}

}

在这种情况下,实现自定义格式是创建4个字符的块并将其通过“-”连接的简单情况:

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


如果适用于的textField(_:shouldChangeCharactersIn:replacementString:)方法UITextFieldDelegate,我们可能希望过滤掉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

}

上面的最后一部分将截断用户可能粘贴的字符串(假定它们都是数字的),例如

// current 

1234-1234-123

// user paste:

777777777

/* ^^^^ will not be included due to truncation */

// will result in

1234-1234-1237-7777

以上是 在输入文本字段时在文本字段字符之间添加空格 的全部内容, 来源链接: utcz.com/qa/415900.html

回到顶部