2013-08-16 11 views
5

誰かがこれを見て欲しいと願っています。UITextFieldを入力するときに少し遅れてアクションを実行してください。

私は会社のアプリを開発しており、カスタムUITextFieldの検索フィールドを持っています。現在は、入力された各文字で検索を絞り込みます。

問題:それらが検索していることを示す少しのポップアップがあり、それぞれのキーを押すたびに、画面上で点滅することがわかります。彼らは明らかにこれを望んでいません。

どのように考えていたのかわからないけど、すべてのキー押しで検索を絞り込み、入力が終わったら検索してください。しかし、私はまた、 "検索"ボタンを追加する必要はありません。私はちょうど彼らがタイピング、1秒、遅延または何かを終了したい、検索が発生します。

ユーザーが入力を完了したことを検出する方法はありますか?誰もこれをやったことがありますか?

ありがとうございます。

+0

可能な複製(http://stackoverflow.com/questions/7061377/how-to-detect [UISearchBar/UITextFieldのために入力して一時停止を検出する方法は?] -a-pause-in-uisearchbar-uitextfield) – Cristik

答えて

7

おそらく単純なNSTimerでこれを行うことができます。 shouldChangeCharactersInRange:で、タイマーが有効かどうかをチェックし、タイマーが有効である場合は無効にしてから、タイマーを再起動します。最終的には時間が大声で鳴ると、その時間の間に指定した間隔で何も入力していないことを意味します。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 

    return YES; 
} 

@Jai Govindaniは、このメソッドを実装するために指摘したように、あなたはあなたのUITextFieldのの代理人としてあなたのコントローラを割り当て、あなたのコントローラがUITextFieldDelegateプロトコルに準拠を確認する必要があります。

+0

もちろん、UITextFieldのデリゲートとして自分自身を設定することを忘れないでください。 –

+0

これは意味があり、素晴らしいスタートですが、クラッシュしています。おそらく初期化の問題が原因でしょうか?私はフィールドに最初の文字を入力しますが、何も起こりません(遅れても)。フィールドに2番目の文字を入力してクラッシュしてください! EXC_BAD_ACCESSエラー。私はここの近くにいるように感じる。 – r0ddy

+0

@ r0ddy問題が何であるかは言うまでもありませんが、すべてが正しく整理されたら、このアプローチはあなたが望むように機能するはずです。 –

0

あなたは方法timerWithTimeIntervalでUITextFieldデリゲートメソッド

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
+0

これは、ユーザーが入力を完了するまですべてを遅らせるのではなく、すべての更新を遅らせるだけです。 –

+0

@ 0x7fffffffそれは私の間違いだ。セレクタは複数回呼び出されます。私は間違った答えだと同意した。 – Exploring

5

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>]; 

次の方法を試すことができます:ターゲット:セレクタ:のUserInfo:繰り返して:あなたは、実行ループにタイマーを追加する必要があります。私は次のように答えを編集するために必要な:の

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode]; 
    return YES; 
} 
関連する問題