我想将进入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/