Changing the keyboard input type to All Charactersdoes not prevent the user from switching back to lowercase letters (at least in iOS 13). I use the following code (Swift 5.1) to use only new characters added to the text box with an uppercase letter instead of asking the full line again and again, as suggested in some other answers.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let firstLowercaseCharRange = string.rangeOfCharacter(from: NSCharacterSet.lowercaseLetters)
if let _ = firstLowercaseCharRange {
if let text = textField.text, text.isEmpty {
textField.text = string.uppercased()
}
else {
let beginning = textField.beginningOfDocument
if let start = textField.position(from: beginning, offset: range.location),
let end = textField.position(from: start, offset: range.length),
let replaceRange = textField.textRange(from: start, to: end) {
textField.replace(replaceRange, withText: string.uppercased())
}
}
return false
}
return true
}
source
share