本意是限制輸入僅英文字母和數(shù)字,同時(shí)將字母轉(zhuǎn)為大寫。
測試發(fā)現(xiàn)了在修改的時(shí)候,每輸入一個(gè)字符,光標(biāo)都跑到最后,無法連續(xù)輸入修改。
解決辦法:
class CustomField {
// ...
addTarget(self, action: #selector(upperText), for: .editingChanged)
delegate = self
// ...
}
extension CustomField: UITextFieldDelegate {
@objc private func upperText() {
let textRange: UITextRange? = selectedTextRange
text = text?.uppercased()
selectedTextRange = textRange
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard !string.isEmpty else {return true}
let set: CharacterSet = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
.inverted
let result: String = string.components(separatedBy: set)
.joined(separator: "")
var valid: Bool = result == string
let textFieldContent: String = (textField.text ?? "")
.appending(string)
if valid, textFieldContent.count > 10 {
// 字符合法,但是追加后超出長度限制
valid = false
}
return valid
}
}