do it better
do it better

Reputation: 4807

How to block entering non-english characters on UITextField?

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

Answers (3)

Ahmadreza
Ahmadreza

Reputation: 7212

Swift 5+

func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".lowercased().contains(text.lowercased())
}

Upvotes: 0

ece.vishesh
ece.vishesh

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

Matt Le Fleur
Matt Le Fleur

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

Related Questions