我有一个搜索栏,其中包含UITableView
在用户键入时填充(使用 JSON 服务)的建议。这些服务调用需要在 500 毫秒的非打字延迟后进行。如果用户在这 500 毫秒的时间段内开始输入,则需要取消队列中的当前呼叫,并且应用程序必须再等待 500 毫秒的非活动状态才能进行另一个afterDelay
呼叫。我知道我必须performSelector:withObject:afterDelay
在整个情况下使用,但我无法在适当的条件下解决。我尝试使用一堆布尔值,但它变得很脏......有什么帮助吗?
问问题
1127 次
2 回答
7
我会使用 anNSTimer
而不是performSelector:withObject:afterDelay:
. 检测文本何时更改UISearchBar
并重置计时器。
-(void)viewDidLoad {
search.delegate = self;
}
-(void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
[timer invalidate];
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(callTheService) userInfo:nil repeats:NO];
}
于 2012-09-04T18:21:04.587 回答
6
这个怎么样,假设你正在检测输入一个UITextFieldDelegate
方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sendNetworkRequest) object:nil];
[self performSelector:@selector(sendNetworkRequest) withObject:nil afterDelay:0.5];
return YES;
}
- (void)sendNetworkRequest
{
// Here immediately send the request
}
我喜欢这种解决此类问题的方法,因为这意味着我不必使用NSTimer
或跟踪我是否正在等待查看是否输入了更多文本的任何状态。希望这可以帮助!如果您有任何问题,请告诉我。
编辑:看到你正在使用搜索栏。原理是一样的,只要把cancel/perform配对放到合适的UISearchBarDelegate
方法中即可。
于 2012-09-04T18:17:48.660 回答