【问题标题】:Perform action after slight delay when typing in UITextField在输入 UITextField 时稍有延迟后执行操作
【发布时间】:2013-08-19 01:10:50
【问题描述】:

希望有人能对此有所了解。

我正在为一家公司开发一个应用程序,他们有一个自定义 UITextField 的搜索字段。目前,它使用输入的每个字母细化搜索。

问题:他们有一个小弹出窗口表明它正在搜索,并且每次按键时,您都会看到它在屏幕上闪烁。显然,他们不想要这个。

虽然不确定如何做,但我正在考虑做的不是在每次按键时优化搜索,而是在他们完成输入时进行搜索。但是,我也不想添加“搜索”按钮。我只是希望他们完成输入,一秒钟,延迟什么的,搜索发生。

有没有办法检测用户何时完成输入?有人做过吗?

提前致谢。

【问题讨论】:

标签: ios uitextfield


【解决方案1】:

你可以用一个简单的 NSTimer 来做到这一点。在shouldChangeCharactersInRange: 中检查计时器是否有效,如果有效,则使其无效,然后重新启动计时器。当时间终于响起时,这意味着用户在您指定的时间间隔内没有输入任何内容。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (someTimer.isValid) {
        [someTimer invalidate];
    }
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO];

    return YES;
}

正如@Jai Govindani 指出的那样,为了实现此方法,您需要将控制器指定为 UITextField 的委托,并确保您的控制器符合 UITextFieldDelegate 协议。

【讨论】:

  • 当然不要忘记先将自己设置为 UITextField 的代表
  • 这是有道理的,这是一个很好的开始,但我遇到了崩溃。可能是由于初始化问题?我在该字段中键入第一个字母,没有任何反应(即使在延迟之后)。在字段中输入第二个字母,崩溃! EXC_BAD_ACCESS 错误。我觉得我在这里很近。
  • @r0ddy 很难说问题出在哪里,但是一旦你把所有的东西都安排好了,这种方法应该能如你所愿。
  • 抱歉,还在学习中。尝试像这样在 viewController 中初始化 someTimer: someTimer = [[NSTimer alloc] init];我认为这是不正确的?
  • @r0ddy 是的,NSTimer 的初始化包含在我提供的示例代码中。除此之外,您需要做的就是配置 UITextFieldDelegate,并创建对计时器的全局引用,这应该可以工作。
【解决方案2】:

你可以试试下面的方法

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>];

在UITextField委托方法中

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

【讨论】:

  • 这只会延迟每次更新,而不是延迟一切,直到用户完成输入。
  • @0x7fffffff 好的。明白我的错误。它将多次调用选择器。我同意这是一个错误的答案。
【解决方案3】:

使用 timerWithTimeInterval:target:selector:userInfo:repeats: 方法,您必须将计时器添加到运行循环。我需要编辑答案如下:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string{
    if (someTimer.isValid) {
        [someTimer invalidate];
    }
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO];
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode];
    return YES;
}

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多