当前位置: 首页 > 面试题库 >

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

阎涵忍
2023-03-14
问题内容

我有一个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

            }

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


问题答案:

我们可以从实现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


 类似资料:
  • 问题内容: 当我在文本字段中输入文本时,它将被删除。 这是代码: 问题答案: 同意Subir Kumar Sao和Faiz。

  • 当我在文本字段中输入文本时,它会被删除。 代码如下:

  • 问题内容: 我想在输入文本字段的同时更新我的​​文本区域,但是在输入时我延迟了1次击键,即当我按下一个键时,会显示上一个键。这是我的代码段 问题答案: 我不建议使用 只需在您的via中添加一个: 里面每个方法(,和)只需要一个电话设置你的文字通过: 这是我做的一个例子:

  • 我在selenium查找输入文本字段时遇到了问题--'billing-address__line-1我使用的代码是- 错误信息 线程“main”org.openqa.selenium.nosuchelementException:没有这样的元素:无法定位元素:{“method”:“xpath”,“selector”:“.//fieldset[.//input[@id='billing-addres

  • 问题内容: 我正在尝试我的React.js的第一部分,并在很早的时候就陷入了困境…我有下面的代码,该代码将搜索表单呈现为。但是,在搜索框中输入内容无济于事。 大概在通过道具并上下移动时会丢失一些东西,这似乎是一个常见问题。但是我很沮丧-我看不到缺少的东西。 (最终,我会使用其他类型的,但是我只是想让这一类正常工作。) 问题答案: 您尚未将道具放在机箱中。它必须在JSX中。 在文档中充分考虑了将 p

  • 问题内容: 我正在使用JavaFX和Scene Builder,并且有一个带有文本字段的表单。这些文本字段中的三个从字符串解析为双精度。 我希望它们是学校成绩,因此只能将其设置为1.0到6.0之间。不应允许用户写“ 2.34.4”之类的内容,但可以写“ 5.5”或“ 2.9”之类的内容。 验证已解析字段: 如何测试用户输入的值是否正确? 我已经在Stackoverflow和Google上进行了搜索