当用户输入 时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
您选择的预定义。或者,如果您不使用 Storyboard,您可以通过编程方式进行操作。
[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 秒。