在SearchBar textDidChange委托中执行一次代码

时间:2014-12-03 06:06:43

标签: ios uisearchbar uisearchbardelegate

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

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

        if ([searchText length] >= 3) { 

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

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

如何实现这一目标?肯定+1正确答案。

3 个答案:

答案 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");
}