2016-08-23 11 views
5

夕方、私のアプリでは、いくつかのUITextfieldがあります。それぞれと異なるの制限を確認する必要があります。Swift3:UITextFieldでユーザーが入力したテキストを検証する最善の方法

例えば、私は私が見つけたアップルのドキュメントから、などの日付フィールド、郵便番号フィールド、SSNフィールド

を持っている:

は、以下のような重要なタスクを処理するデリゲートオブジェクトを割り当てます

  • ユーザーがテキストフィールドの内容を編集できるようにするかどうかを決定します。

  • ユーザーが入力したテキストを検証します。

  • キーボードの戻るボタンのタップに応答します。

  • アプリの他の部分にユーザーが入力したテキストを転送します。

  • コントローラオブジェクトの1つにテキストフィールドへの参照を格納します。

だから、私は、デリゲートとfunc textFieldDidEndEditing(_:)を使用する必要があります確信しています。

の文をfunc textFieldDidEndEditing(_:)の中に使用して、代理人の違いの制限を確認することが唯一の方法です。

この問題に直面するためのより良い、より安全で高速なパターンがありますか?

+1

たとえば、テキストフィールドのタグを区別するswitch文がここに行く方法だと思います。 @MauriceA。 – Maurice

+0

ありがとう、それはまさに私が考えていたことです、誰かが私たちに他のパターンを与えることができるか見てみましょう。 :) –

答えて

1

あなたはあなたのすべてのテキストフィールドにユニークなtagを設定することができますし、textFieldDidEndEditingで比較することができ、次のように比較することができます。また、すべてのテキストフィールドのIBOutletを取ることができますなどtextFieldDidEndEditingでそれを比較することができます

func textFieldDidEndEditing(textField: UITextField) { 

    // By tag 
    if textField.tag == 100 { 

    } 

    // OR 

    //by outlet 
    if textField == self.myTextField { 


    } 
} 
+0

ありがとうKetan、私はタグについて知りませんでした! –

+0

あなたは大歓迎です:) ... – Lion

+0

タグは良くありません、Annie Devの解決策は良いです。 –

1

テキストフィールド1場合は、

、あなたがテキストフィールドをチェックする必要がありますが、どちらかあなたが言ったようにあなたは、switchステートメントを使用して別のテキストフィールドに割り当てられたタグを確認することができ、 か、テキストフィールド自体を比較することができ、のTextField2右されています、2つのテキストフィールドへの出口は、あなたが

func textFieldDidEndEditing(textField: UITextField) 
{ 
    if textField == textfield1 
    { 

    } 
    else if textField == textfield2 
    { 

    } 
} 
+0

ありがとう!私はこの解決策のために行くだろう。 –

1

あなたは、あなたがこのような検証方法を作成することができ、検証

enum Type { 
    case zipcode 
    case number 
} 

のための列挙型を作成することができます。

func isValidate(text: String, type: Type) -> Bool { 
    switch type { 
    case .zipcode: 
     ... 
    } 
} 

このメソッドはUtilのクラスにすることができます。これはベストプラクティスです。あなたのロジックがカプセル化されているからです。

+0

Farhadありがとうございますが、既にアウトレットが宣言されています。新しいenumを作成するよりも早くコンセントを使用する方が速いと思います。 –

1

テキストフィールドにコミットされたり、フィードバックを提供したい場合は、テキストフィールドは編集中のテキストをより詳細に制御する必要がある場合は、代わりに別のデリゲートを実装する必要があります

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    // Build and check the new text value. Accept or reject the change. 
} 

デリゲートでは、新しいtext値を作成できます。 (「パスワードは8文字以上でなければなりません」、「これは有効なIBANではありません」)、変更を承認または却下します(つまり、返品false)。

textプロパティを手動で割り当てた場合、代理人はではなく、が呼び出されることに注意してください。さらに、このデリゲートは、テキストがテキストフィールドに貼り付けられたり、テキストフィールドから削除されたときに呼び出されます。

関連する問題