在搜索栏中的时间间隔后执行功能 - objective-c

时间:2014-12-11 10:23:52

标签: ios objective-c uisearchbar

如果用户在搜索栏中输入文字后保持空闲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键,则代码执行两次,有时会因为"使计时器无效而崩溃

上述代码应该做些什么改变?

2 个答案:

答案 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为真),意味着当您点击搜索按钮(输入)时,它将调用上面的委托并取消之前对此方法的任何调用。

所以它不会再打两次电话。简单! :)