6

ユーザーが を入力しているときUITextfieldに 2 秒間停止すると、カーソルはまだ にUITextfieldあるので、このイベントをどのように識別できるでしょうか? つまり、最初の応答者を辞任せずに、編集が終了したかどうかを確認したいUITextField。それを行う方法は何ですか?

4

4 に答える 4

12

はい、確認できます!UITextFieldデリゲートで 、- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

- (void) callMeAfterTwoSeconds {
    NSLog(@"I'll call after two seconds of inactivity!");
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    [NSRunLoop cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(callMeAfterTwoSeconds) withObject:nil afterDelay:2.0];

    return YES;
}

入力している間 (キーボードからキーをタップしている間)、関数の以前の呼び出しをキャンセルし、callMeAfterTwoSeconds停止すると、2 秒後に呼び出すように設定し、はい、2 秒後に呼び出します。

更新: そのテキストフィールドをオブジェクトとして渡して、performSelectorどのテキストフィールドが非アクティブであるかを知ることもできます。そのため、callMeAfterTwoSeconds関数は次のようになります。

- (void) callMeAfterTwoSeconds:(UITextField *)textfield {
    if(textfield == txtUserName) {
        NSLog(@"User textfield has NO activity from last two seconds!"); }
}
于 2013-03-14T12:25:28.630 に答える
6

の接続インスペクタに移動しUITextField、送信済みイベント リストから「変更された編集」をIBAction選択した定義済みイベントに接続します。ストーリーボードを使用していない場合は、プログラムで行うこともできます。

[youTextField addTarget:self action:@selector(textFieldInputDidChange:) forControlEvents:UIControlEventEditingChanged];

これで、IBAction接続した は、ユーザーが で文字を変更するたびに起動されますUITextFieldivar としてタイマーを作成します。呼び出されるたびIBActionに、タイマーを開始します。新しい呼び出しによって再開されずに 2 秒に達する場合は、ユーザーがUITextField.

于 2013-03-14T12:20:38.973 に答える
2

これは searchBar に対して行いましたが、UITextField でも機能すると思います。コードは Swift です。:)

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    searchTimer?.invalidate()
    searchTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("search"), userInfo: nil, repeats: false)
}

func search() {
    println("search \(searchBar.text)")
}
于 2015-05-21T20:45:27.867 に答える
-1

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self]電話をかけるのは良い習慣ではないと思います。

代わりに、次のようにします。

[self.searchTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
//or select the textfield in the storyboard, go to connections inspector and choose the target for 'Editing Changed'


- (IBAction)textFieldDidChange:(id)sender {
    [self performSelector:@selector(editingChanged:) withObject:self.searchTextField.text afterDelay:2.0]; 
}

- (void)editingChanged:(NSString *)text {
    if ([text isEqualToString:self.searchTextField.text]) {
        //do your thing
    }
}

このようにして、ユーザーが入力すると への呼び出しがトリガーeditingChanged:され、その間に値が変更されたかどうかを再確認できます。変更されていない場合、ユーザーは入力を2秒間停止しました。

于 2013-11-19T16:51:44.270 に答える