0

当用户在搜索栏中输入三个或更多字符时,我想执行某些代码(仅一次) 。我使用了以下代码:

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

        if ([searchText length] >= 3) { 

         [self performSelector:@selector(searchBarSearchButtonClicked:) withObject:theSearchBar afterDelay:3.0];    
        }    
   }

使用上述代码的问题是它执行的次数大于三。例如。如果在搜索栏中输入五个字符,则它会执行三次(只需要一次)。

如何做到这一点?正确答案肯定+1。

4

3 回答 3

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;
}

好吧,这是这个答案的最后更新,我不喜欢BOOLs 所以我做了一个定义标签来实现这个,kSilentTag应该是任何东西,但不匹配kViolentTag,也应该是你的默认标签UISearchBar

重要的是,在任何时候,如果您要重置搜索栏(意味着清空它),只需确保将其标签更改为kSilentTagback。

建议,你已经设置了 3.0 的时间间隔来执行选择器,你应该把它设置得少一些(可能是 1.0),因为,用户肯定会感觉到发生了什么!(就像我们之前在 WindowsXP PC 上的感觉)?^_^

于 2014-12-03T06:22:10.293 回答
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];
}
于 2014-12-23T06:45:14.867 回答
-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");
}
于 2014-12-03T08:21:41.203 回答