2016-01-02 11 views
5

Sto cercando di completare la convalida del modulo in Swift e non riesco a trovare un modo per testare solo caratteri alfanumerici in un UITextField.text.Test stringa di testo UITextField per contenere solo caratteri alfanumerici

Ive ha trovato NSCharacterSet per aiutare a testare se è stato inserito almeno 1 lettera (finora):

@IBOutlet weak var username: UITextField! 
let letters = NSCharacterSet.letterCharacterSet() 

//Check username contains a letter 
    if (username.text!.rangeOfCharacterFromSet(letters) == nil) { 
     getAlert("Error", message: "Username must contain at least 1 letter") 
    } 

Ora ho solo bisogno di un modo per convalidare che solo i numeri, lettere (forse anche di sottolineatura e trattini) essere inserito Un sacco di cose là fuori per Obj-C ma ho bisogno di una soluzione SWIFT per favore.

Grazie in anticipo.

risposta

6

Controllare se l'inversione del set accettato è presente:

if username.text!.rangeOfCharacterFromSet(letters.invertedSet) != nil { 
    print("invalid") 
} 

letters dovrebbe probabilmente essere alphanumericCharacterSet() se si desidera includere i numeri pure.

Se si desidera accettare caratteri di sottolineatura o più caratteri, sarà probabilmente necessario creare un set di caratteri personalizzato. Ma la logica di inversione rimarrà la stessa.

+0

E puoi creare un set di caratteri che è l'unione (combinazione) di numeri, lettere minuscole e lettere maiuscole. Chiamiamolo alfanumerico. Quindi usa questo approccio per dire "il testo del campo contiene caratteri non compresi nel set alfanumerico" –

+0

@ luk2302 questo non ha funzionato :(Ero ancora in grado di accedere usando la stringa "a_12 -() 11" – Chris

+0

@Chris allora tu Ho usato il codice nel modo sbagliato. Nota che ho invertito la logica del 'if' - ogni volta che soddisfi la condizione if hai un nome utente valido in contrasto con il tuo codice dove soddisfare la condizione if significava uno non valido. – luk2302

1

Anche se è tardi per rispondere, ma questa risposta potrebbe essere utile a qualcuno.

Questo è semplice e ha funzionato come un fascino per me.

Swift 3:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    /// 1. replacementString is NOT empty means we are entering text or pasting text: perform the logic 
    /// 2. replacementString is empty means we are deleting text: return true 
    if string.characters.count > 0 { 
     var allowedCharacters = CharacterSet.alphanumerics 

     /// add characters which we need to be allowed 
     allowedCharacters.insert(charactersIn: " -") // "white space & hyphen" 

     let unwantedStr = string.trimmingCharacters(in: allowedCharacters) 
     return unwantedStr.characters.count == 0 
    } 

    return true 
} 

Nota: Questo funziona per le stringhe incolla nel campo di testo pure. La stringa incollata non verrà visualizzata nel campo di testo se contiene caratteri indesiderati.