如何检测 UISearchBar/UITextField 输入中的暂停?
我有以下 UISearchbar 代码:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSString* endpoint =[NSString stringWithFormat:@"http://www.someurl/",
[searchText stringByReplacingOccurrencesOfString:@" " withString:@"+"]];
NSURL* url = [NSURL URLWithString:endpoint];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request];
[myFetcher beginFetchWithDelegate:self didFinishSelector:@selector(searchResultsFetcher:finishedWithData:error:)];
}
我想在输入暂停后发送此请求,并在每次击中字符时重置计时器。我该怎么做?
I have the following UISearchbar code:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSString* endpoint =[NSString stringWithFormat:@"http://www.someurl/",
[searchText stringByReplacingOccurrencesOfString:@" " withString:@"+"]];
NSURL* url = [NSURL URLWithString:endpoint];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request];
[myFetcher beginFetchWithDelegate:self didFinishSelector:@selector(searchResultsFetcher:finishedWithData:error:)];
}
I want to send this request after a pause in input and reset the timer everytime a character is hit. How can I do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
它不必使用 NSTimer。
It doesn't have to use NSTimer.
在
textDidChange
方法中创建一个 NSTimer,例如 2 秒。如果定时器已经存在,则使定时器无效并重新创建。 (未经测试的代码:)当用户停止输入 2 秒时,-userPaused: 将被调用,并且您的计时器将自动失效(尽管不是零)。当用户再次开始打字时,将设置一个新的计时器。
In the
textDidChange
method create an NSTimer, say 2 seconds worth. If the timer already exists, invalidate and recreate the timer. (Untested code:)When the user stops typing for 2 seconds, -userPaused: will be called and your timer will be automatically invalidated (although not nil). When the user starts typing again a new timer will be setup.
我能够将 Sven Tan 的答案改编为我现有的 Swift 代码。就我而言,我将字符串发送到异步加载搜索结果的方法。此外,我没有使用 UISearchBar,而是使用普通的旧 UITextField。
以下是正在调用的选择器:
cancelPreviousPerformRequestsWithTarget
的工作方式是您需要按顺序传递在performSelector
调用中传递的相同目标、选择器和对象取消先前的请求。在我的实现中,由于我只传递一个字符串,因此我需要在调用之间保留当前的请求字符串,以便我可以引用它来取消请求。结果适用于在我的 UITextField 中输入和删除字符。每次主要搜索词更改仅发送一次搜索。
就像我说的,与 Sven Tan 发布的类似,但用法略有不同。希望这可以帮助一些人。
I was able to adapt Sven Tan's answer to my existing code in Swift. In my case, I am sending the string to a method that loads the search results async. Additionally, I am not using the UISearchBar but rather a plain old UITextField.
Here is the selector that is being called:
The way that
cancelPreviousPerformRequestsWithTarget
works is you need to pass the same target, selector, and object that was passed in theperformSelector
call in order for the previous request to be cancelled. In my implementation, since I am passing just a string, I need to preserve the current request string between calls so I can reference it to cancel requests.The result works for typing and deleting characters into my UITextField. Only one search is sent per major search term change.
Like I said, similar to what Sven Tan posted but slightly different usage. Hopefully this helps some people out.
优秀的代码并且非常适合我。我在这里找到了Replacing an NSTimer with PerformSelector:withObject:afterDelay。 感谢Ben解决方案......所有赏金都给他我只是将其复制到这里以便轻松找到
Excellent code and working perfect for me. I found it here Replacing an NSTimer with performSelector:withObject:afterDelay. Thanks to Ben solution ... all bounties to him i just copy it here to be found easy
阻止搜索文本输入并让 NSTimer 调用选择器。显示某种指示器,以便用户不会认为出现问题。当选择器触发时,将控制权交还给用户以继续输入
Block text input to your search and have an NSTimer call a selector. Show an indicator of some sort so the user doesn't think something is going wrong. When the selector fires give control back to the user to continue typing