ユーザーが を入力しているときUITextfield
に 2 秒間停止すると、カーソルはまだ にUITextfield
あるので、このイベントをどのように識別できるでしょうか? つまり、最初の応答者を辞任せずに、編集が終了したかどうかを確認したいUITextField
。それを行う方法は何ですか?
4 に答える
はい、確認できます!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!"); }
}
の接続インスペクタに移動しUITextField
、送信済みイベント リストから「変更された編集」をIBAction
選択した定義済みイベントに接続します。ストーリーボードを使用していない場合は、プログラムで行うこともできます。
[youTextField addTarget:self action:@selector(textFieldInputDidChange:) forControlEvents:UIControlEventEditingChanged];
これで、IBAction
接続した は、ユーザーが で文字を変更するたびに起動されますUITextField
。ivar としてタイマーを作成します。呼び出されるたびIBAction
に、タイマーを開始します。新しい呼び出しによって再開されずに 2 秒に達する場合は、ユーザーがUITextField
.
これは 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)")
}
[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秒間停止しました。