swift - 光标移动到编辑格式化十进制文本字段时结束 - Swift

标签 swift uitextfield nsformatter

我正在格式化一个 UITextField,这样它在输入时变成逗号分隔(十进制样式)。

所以 12345678 变成了 12,345,678

现在,当我编辑 UITextField 时,说我想删除 5,那时我在 5 之后点击并删除它,但是光标立即移动到文本末尾,即 8 之后。

这是我在输入时用来格式化小数的代码:

func checkTextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
        return true
    }
    let allowedCharacterSet = NSCharacterSet(charactersIn: "0123456789.").inverted
    let filtered = string.components(separatedBy: allowedCharacterSet)
    let component = filtered.joined(separator: "")
    let isNumeric = string == component
    if isNumeric {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
        let number = formatter.number(from: numberWithOutCommas)
        if number != nil {
            var formattedString = formatter.string(from: number!)
            if string == "." && range.location == textField.text?.count {
                formattedString = formattedString?.appending(".")
            }
            textField.text = formattedString
        } else {
            textField.text = nil
        }
    }
    return false
}

它是这样调用的:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let textFieldText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    let checkForCurrency = checkTextField(textField, shouldChangeCharactersIn: range, replacementString: string)
    return checkForCurrency
}

我已经尝试了以下但徒劳无功:

Solution 1

Solution 2

光标移动的原因可能是什么? 它应该类似于 this 链接中的内容 任何帮助将不胜感激!

最佳答案

update your custom function with :

func checkTextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let textFieldText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
            return true
        }

        var currentPosition = 0
        if let selectedRange = textField.selectedTextRange {
            currentPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
        }

        let allowedCharacterSet = NSCharacterSet(charactersIn: "0123456789.").inverted
        let filtered = string.components(separatedBy: allowedCharacterSet)
        let component = filtered.joined(separator: "")
        let isNumeric = string == component
        if isNumeric {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
            let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
            let number = formatter.number(from: numberWithOutCommas)

            if number != nil {
                var formattedString = formatter.string(from: number!)
                if string == "." && range.location == textField.text?.count {
                    formattedString = formattedString?.appending(".")
                }
                textField.text = formattedString

                if(textFieldText.count < formattedString?.count ?? 0){
                    currentPosition = currentPosition + 1
                }
            }else{
                textField.text = nil
            }
        }

        if(string == ""){
            currentPosition = currentPosition - 1
        }else{
           currentPosition = currentPosition + 1
        }

        if let newPosition = textField.position(from: textField.beginningOfDocument, offset: currentPosition) {
            textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
        }
        return false
    }

关于swift - 光标移动到编辑格式化十进制文本字段时结束 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53440489/

相关文章:

ios - 自定义表格 View 单元格中的 UITextField。点击单元格/文本字段时显示选取器 View

arrays - 如何在 Swift 中为 UIPickerView 按字母顺序排列数组

iphone - Swift:下一个按钮的链文本字段

objective-c - 在 `stringValue` 方法中使用自定义 NSFormatter 访问 NSTextField 的 `controlTextDidChange` 使其不可编辑。

ios - 如何在 swift 3 中创建像 Alamofire 这样的自定义闭包

ios - 从 Swift 中的 Int 数组中删除前 n 个元素

ios - 如何从 Helper 类更新 UITabBarController?

ios - 如何在锁定屏幕上显示与左下角相机相同的 iphone 应用程序图标

macos - NSTextField 与 NSFormatter 导致连续绑定(bind)损坏

ios - 格式化体积和质量单位