如果用户在搜索栏中输入文字后保持空闲3秒钟,我想执行一项功能。 我尝试使用以下代码:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
...
if ([searchText length] >= 3) { // If text length is greater than 3
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self
selector:@selector(searchBarSearchButtonClicked:) object:searchBar];
[self performSelector:@selector(searchBarSearchButtonClicked:)
withObject:searchBar afterDelay:3.0];
}
}
此代码的问题是,如果用户输入大于3的文字并按Enter键,则代码执行两次,有时会因为"使计时器无效而崩溃
上述代码应该做些什么改变?
答案 0 :(得分:1)
我使用NSTimer
找到了解决方案。以下是摘录:
- (void) searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
[timer invalidate];
timer = nil;
...
if ([searchText length] >= 3) {
timer = [NSTimer scheduledTimerWithTimeInterval: 3.0 target: self
selector: @selector(SearchBarProxyCall) userInfo:nil repeats: NO];
}
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[timer invalidate];
timer = nil;
...
}
-(void)SearchBarProxyCall {
[self searchBarSearchButtonClicked:searchbar];
}
答案 1 :(得分:0)
您的代码看起来没问题,您在- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
方法中遗漏了一些内容,
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self
selector:@selector(searchBarSearchButtonClicked:) object:searchBar];
....
}
案例1:你已经停止输入并且它与精确的3长度匹配,计时器将调用上面的方法,并且它将在3秒后完全执行。
情况2:计时器设置为3秒(如果情况1为真),意味着当您点击搜索按钮(输入)时,它将调用上面的委托并取消之前对此方法的任何调用。
所以它不会再打两次电话。简单! :)