找出UITextfield的结束编辑,而无需辞职第一响应者

时间:2013-03-14 11:59:22

标签: ios uitextfield user-inactivity

当用户输入UITextfield,并且他停止了2秒时,光标仍在UITextfield,那么我们如何识别此事件?即我想检查编辑是否结束而不从UITextField重新签名第一个响应者。 这样做的方法是什么?

4 个答案:

答案 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秒钟。