Reputation: 4807
I'm trying to block entering non-english letters on UITextField
. Therefore, I wrote the method below. But it errors as "can not decrement startIndex" as normally. I've read some useful Stackoverflow posts but all of them written in obj-c. How can I block non-english letters?
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let englishLetters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
let lastStringText = airportNameField.text?.substringFromIndex((airportNameField.text?.endIndex.advancedBy(-1))!)
if englishLetters.indexOf(lastStringText!) == nil {
airportNameField.deleteBackward()
}
return true
}
Upvotes: 2
Views: 2516
Reputation: 7212
Swift 5+
func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
return "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".lowercased().contains(text.lowercased())
}
Upvotes: 0
Reputation: 21
Swift 4
I have implemented the following solution for the Address field. You can modify the CharacterSet per your requirement.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var characterSet = CharacterSet()
characterSet.formUnion(.lowercaseLetters) // e.g. a,b,c..
characterSet.formUnion(.uppercaseLetters) // e.g. A,B,C..
characterSet.formUnion(.decimalDigits) // e.g. 1,2,3
characterSet.formUnion(.whitespaces) // " "
characterSet.insert(charactersIn: "@,&:-") // Specific Characters
let invertedCharacterSet = characterSet.inverted
let components = string.components(separatedBy: invertedCharacterSet)
let filtered = components.joined(separator: "")
return string == filtered
}
Upvotes: 2
Reputation: 2856
Try this:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
/* So first we take the inverted set of the characters we want to keep,
this will act as the separator set, i.e. those characters we want to
take out from the user input */
let inverseSet = NSCharacterSet(charactersInString:"ABCDEFGHIJKLMNOPQRSTUVWXUZ").invertedSet
/* We then use this separator set to remove those unwanted characters.
So we are basically separating the characters we want to keep, by those
we don't */
let components = string.componentsSeparatedByCharactersInSet(inverseSet)
/* We then join those characters together */
let filtered = components.joinWithSeparator("")
return string == filtered
}
Make sure you have added UITextFieldDelegate
to your class and then also make sure your textField's delegate is set correctly.
Upvotes: 10