4

我有一个搜索栏,其中包含UITableView在用户键入时填充(使用 JSON 服务)的建议。这些服务调用需要在 500 毫秒的非打字延迟后进行。如果用户在这 500 毫秒的时间段内开始输入,则需要取消队列中的当前呼叫,并且应用程序必须再等待 500 毫秒的非活动状态才能进行另一个afterDelay呼叫。我知道我必须performSelector:withObject:afterDelay在整个情况下使用,但我无法在适当的条件下解决。我尝试使用一堆布尔值,但它变得很脏......有什么帮助吗?

4

2 回答 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 回答