当用户停止input时,UISearchBar会检测到,并且不会立即search,因此检测到暂停

我正在寻找实现一个UISearchbar从一个URL检索信息,并使用默认的方法:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 

我可以立即检测到文本更改并执行URL的提取,但是这样,文本types是慢的,因为iPhone正在search的URL,所以我想开始取回的URL当用户停止写一些第二,所以我想检测打字的暂停刷新表视图检索由url的信息。 我发现了这个请求的一个较老的post,我已经尝试了一个解决scheme,对我来说不工作:

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(request:) object:searchText]; //..... [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; } -(void)request:(NSString *)myString { NSLog(@"%@",myString); } 

在这种方式当我input的请求方法不被调用,但是当我停止input它的每个字符我打电话,所以是相同的默认方法,我错了什么? 或者执行不正确?

它看起来像提供的解决scheme不工作,因为cancelPreviousPerformRequestsWithTarget:selector:object:的“searchText”参数不匹配前一个调用performSelector:withObject:afterDelay:的“searchText”参数performSelector:withObject:afterDelay: 所以延迟search排队每个文本更改,并从未取消。

您可以使用NSTimer延迟search的调用,并在文本更改时取消计时器:为对象提供NSTimer属性或字段; 在searchBar:textDidChange:取消任何现有的计时器,然后创build并安排一个新的计时器。 计时器的目标应该调用你的search方法。

像(从我的头顶上):

 // in your class' .h object fields { ... NSTimer *searchDelayer; // this will be a weak ref, but adding "[searchDelayer invalidate], searchDelayer=nil;" to dealloc wouldn't hurt ... } // in the .m -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [searchDelayer invalidate], searchDelayer=nil; if (YES /* ...or whatever validity test you want to apply */) searchDelayer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(doDelayedSearch:) userInfo:searchText repeats:NO]; } -(void)doDelayedSearch:(NSTimer *)t { assert(t == searchDelayer); [self request:searchDelayer.userInfo]; searchDelayer = nil; // important because the timer is about to release and dealloc itself } 

有些程序员可能不像我在这里那样引用弱引用。

[编辑补充:]

以下是如何设置使用cancelPreviousPerformRequestsWithTarget …的方法:

 // in your class' .h object fields { ... NSString *priorSearchText; // this will NOT be a weak ref, so adding "[priorSearchText release]" to dealloc is also required ... } // in the .m -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(request:) object:priorSearchText]; [priorSearchText release], priorSearchText = [searchText retain]; if (YES /* ...or whatever validity test you want to apply */) [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; } 

我不认为我曾经使用cancelPreviousPerformRequestsWithTarget:…是真实的,所以我不知道它是否隐藏任何意外。 如果遇到问题,请添加NSLogs,查找延迟的search,而不是在他们应该取消的时候。

移动这一行: [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; 出你的textDidChange方法,并把它放在文本中开始编辑方法: - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar