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

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

现在,IBAction每次用户更改UITextField. 创建一个计时器作为 ivar。现在每次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 回答