当用户输入UITextfield
,并且他停止了2秒时,光标仍在UITextfield
,那么我们如何识别此事件?即我想检查编辑是否结束而不从UITextField
重新签名第一个响应者。
这样做的方法是什么?
答案 0 :(得分:11)
是的,我们可以检查一下!使用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!"); }
}
答案 1 :(得分:6)
转到UITextField
的连接检查器,将“已发送事件”列表中的“已更改编辑”连接到您选择的预定义IBAction
。或者,如果您不使用Storyboard,则可以以编程方式执行此操作。
[youTextField addTarget:self action:@selector(textFieldInputDidChange:) forControlEvents:UIControlEventEditingChanged];
现在,每次用户更改IBAction
中的字符时,您刚刚连接的UITextField
都会被触发。创建一个timer作为ivar。现在,每次调用IBAction
时,启动计时器,如果它在没有重新启动新呼叫的情况下达到2秒,您就知道用户没有在UITextField
中输入/删除值。
答案 2 :(得分: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)")
}
答案 3 :(得分:-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秒钟。