2016-01-02 13 views
5

Swiftでフォーム検証を完了しようとしていますが、UITextField.text内の英数字文字のみをテストする方法はありません。テストUITextField英数字のみを含むテキスト文字列

@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") 
    } 

今、私はちょうどその数値だけ、文字(多分アンダースコアとダッシュ)を検証する方法が必要です:少なくとも1つの文字は(今のところ)に入力された場合

アイブ氏はNSCharacterSetがテストを支援するました入力する。そこにはObj-Cのためのたくさんのものがありますが、私はSWIFTの解決策を必要としています。

は、事前にありがとうございます。

答えて

6

チェックあなたの受け入れセットの反転が存在する場合:あなたにも数字を含める場合

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

lettersはおそらくalphanumericCharacterSet()でなければなりません。

アンダースコアまたはそれ以上の文字を受け入れる場合は、おそらく自分で文字セットを作成する必要があります。しかし、反転ロジックは同じままです。

+0

そして、数字、小文字、および大文字の和集合(組み合わせ)である文字セットを構築できます。 alphanumericSetと呼ぶことにしましょう。このアプローチを使用して、 "フィールドのテキストには、英数字セットに含まれていない文字が含まれていますか" –

+0

@ luk2302これはうまくいきませんでした:(まだ文字列 "a_12 - ()11"を使用してログインできました – Chris

+0

@Chris then私がif条件の条件を満たしていれば有効なユーザ名を持っているif条件を満たすたびに、無効なものを意味することに注意してください。 – luk2302

1

答えが遅れても、この回答は役に立ちます。

これは簡単で、私の魅力のように機能します。

スウィフト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 
} 

注:これは、同様のテキストフィールドに文字列を貼り付けるために動作します。不要な文字が含まれている場合、貼り付けられた文字列はテキストフィールドに表示されません。

関連する問題