当用户在搜索栏中输入三个或更多字符时,我想执行某些代码(仅一次)。我使用下面的代码:
- (void) searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
if ([searchText length] >= 3) {
[self performSelector:@selector(searchBarSearchButtonClicked:) withObject:theSearchBar afterDelay:3.0];
}
}
使用上述代码的问题是执行的次数大于3次。例如。如果在搜索栏中输入了五个字符,则它将执行三次(仅需要一次)。
如何实现这一目标?肯定+1正确答案。
答案 0 :(得分:1)
#define kSilentTag 0
#define kViolentTag 1
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSString *newString = [searchBar.text stringByReplacingCharactersInRange:range withString:text];
if ([newString length] >= 3) {
if(searchBar.tag == kSilentTag) {
searchBar.tag = kViolentTag;
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(searchBarSearchButtonClicked:) object:searchBar];
[self performSelector:@selector(searchBarSearchButtonClicked:) withObject:searchBar afterDelay:3.0];
}
}else{
searchBar.tag = kSilentTag;
}
return YES;
}
Okey,这是这个答案的最后更新,我不想接受BOOL
,所以我制作了一个定义标签来实现这一点,kSilentTag
应该是除了&# 39; t与kViolentTag
匹配,也应该是UISearchBar
的默认标记。
重要,在任何时候,如果您要重置搜索栏,(意味着清空它),请确保将其标记更改为kSilentTag
。
建议,你已经设置了3.0时间间隔来执行选择器,你应该设置一些(可能是1.0)因为,用户肯定会感觉到发生了什么! (就像我们之前在WindowsXP PC上所感受到的那样)? ^ _ ^
答案 1 :(得分:0)
我使用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];
}
答案 2 :(得分:-1)
以下代码可以帮助您。它对我有用。
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([searchBar text].length ==2) {
[self performSelector:@selector(searchBarSearchButtonClicked:) withObject:searchBar afterDelay:3.0];
}
return YES;
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
NSLog(@"Third text Entered");
}