我创建了正则表达式逻辑,它工作正常,但除了一个文本字段之外,我还可以拥有其中的几个文本字段,我创建了一个字典和一个变量,以便它给我一个 bool 值 true,前提是所有传递正则表达式的文本字段验证为 true,但尽管如此,当一个文本字段返回 true 时,allFieldsValid 也返回 true,我需要所有文本字段通过正则表达式检查并接收值 true,我该如何解决此问题?如果我的代码不正确,请帮助我纠正它。
我写下我的细胞代码
var regexValidate: Bool? = false
var validationResults: [String: Bool] = [:]
var allFieldsValid: Bool? = false
var requiredFields: Set<String> = []
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
if let regexPattern = regex {
print("IT IS REGEX!!--> [ \(regexPattern)")
let prospectiveText = (textField.text as NSString?)?.replacingCharacters(in: range,
with: string) ?? string
regexValidate = regexValidate(prospectiveText, withPattern: regexPattern)
if regexPattern == ""{
regexValidate = true
}
validationResults[paymentParametrName ?? ""] = regexValidate ?? false
requiredFields.insert(paymentParametrName ?? "")
allFieldsValid = checkAllFieldsValid()
print(" IS VALIDATE FOR CURRENT TEXTFIELD?? -->\(regexValidate) ] ---")
print("--->FULL Validation TEXTFIELDS: \(allFieldsValid)")
}
return true
}
private func regexValidate(_ text: String, withPattern pattern: String) -> Bool {
let regex = try? NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: text.utf16.count)
let matches = regex?.matches(in: text, options: [], range: range) ?? []
return matches.count == 1 && matches.first?.range == range
}
private func checkAllFieldsValid() -> Bool {
for field in requiredFields {
if validationResults[field] != true {
return false
}
}
return !requiredFields.isEmpty
}
导入UIKit
ViewController 类:UIViewController {
let textField1 = UITextField()
let textField2 = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
setupTextFields()
}
func setupTextFields() {
textField1.placeholder = "Enter text 1"
textField2.placeholder = "Enter text 2"
textField1.borderStyle = .roundedRect
textField2.borderStyle = .roundedRect
textField1.translatesAutoresizingMaskIntoConstraints = false
textField2.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(textField1)
view.addSubview(textField2)
NSLayoutConstraint.activate([
textField1.centerXAnchor.constraint(equalTo: view.centerXAnchor),
textField1.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -20),
textField1.widthAnchor.constraint(equalToConstant: 200),
textField2.centerXAnchor.constraint(equalTo: view.centerXAnchor),
textField2.topAnchor.constraint(equalTo: textField1.bottomAnchor, constant: 20),
textField2.widthAnchor.constraint(equalToConstant: 200)
])
textField1.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
textField2.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
}
func isValidText(_ text: String, pattern: String) -> Bool {
let regex = try! NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: text.utf16.count)
return regex.firstMatch(in: text, options: [], range: range) != nil
}
@objc func textFieldDidChange(_ textField: UITextField) {
let pattern = "^[a-zA-Z0-9]*$" // Example pattern: Alphanumeric characters only
if let text = textField.text, isValidText(text, pattern: pattern) {
textField.layer.borderColor = UIColor.green.cgColor
textField.layer.borderWidth = 1.0
} else {
textField.layer.borderColor = UIColor.red.cgColor
textField.layer.borderWidth = 1.0
}
}
}