我想将进入UITextView的内容限制为Doubles,每个Double由一个空格分隔。当然这意味着只允许有一个小数点。
以下代码删除字母和符号,但不适用于小数。输入小数点后,键入的下一个字符将删除小数点。
我做错什么了???

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    @IBOutlet weak var dataInputField: UITextView!

    var currentEntryHasDecimalPoint:Bool = false
    var validChars: Set<Character> = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", " "]


    override func viewDidLoad() {
        super.viewDidLoad()
        dataInputField.delegate = self
    }


    func textViewDidChange(_ textView: UITextView ) {

        if let str = dataInputField.text, !str.isEmpty {

            let validChar:Bool = Set(str).isSubset(of: validChars)
            if validChar {

                let newChar = str.last!
                switch newChar {
                case ".":
                    currentEntryHasDecimalPoint = true
                    validChars.remove(".")
                case " ":
                    currentEntryHasDecimalPoint = false
                    validChars.insert(".")

                default:
                    print("default")
                }
            }

            else {
                dataInputField.deleteBackward()
            }
        }
    }

}

最佳答案

因为deleteBackward()确实会对textView进行更改,所以它也会触发textViewDidChange。由于"."已从validChars中删除,当您输入"."后接一个字母时,该字母将被删除并触发textViewDidChange,然后"."将被删除。您应该使用正则表达式来验证文本,而不是使用/^(?:[0-9]+(?:\.$|\.[0-9]+)?(?:\s+|\s*$))+$/操作。

func textViewDidChange(_ textView: UITextView ) {

    if let str = textView.text,
        !str.isEmpty,
        let regex = try? NSRegularExpression(pattern: "^(?:[0-9]+(?:\\.$|\\.[0-9]+)?(?:\\s+|\\s*$))+$", options: []),
        regex.numberOfMatches(in: str, options: [], range: NSRange(location: 0, length: str.count)) == 0
    {
        textView.deleteBackward()
    }
}

关于ios - 使用textViewDidChange限制UITextView中的字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54067904/

10-10 05:44