Ограничение символов в UITextView с textViewDidChange - PullRequest
0 голосов
/ 07 января 2019

Я хочу ограничить то, что вводится в UITextView, значениями Double, каждый 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()
            }
        }
    }

}

1 Ответ

0 голосов
/ 07 января 2019

Поскольку deleteBackward() вносит изменения в textView, оно также вызывает textViewDidChange. Поскольку "." уже был удален из validChars, когда вы вводите ".", за которым следует буква, буква будет удалена и активирует textViewDidChange, тогда "." будет удалено. Вам следует проверить текст, используя регулярное выражение /^(?:[0-9]+(?:\.$|\.[0-9]+)?(?:\s+|\s*$))+$/ вместо операций Set.

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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...