0

ユーザーが検索バーに 3 文字以上入力したときに特定のコードを(1 回だけ)実行したい。以下のコードを使用しました:

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

        if ([searchText length] >= 3) { 

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

上記のコードを使用する際の問題は、実行回数が 3 回を超えることです。例えば。検索バーに 5 文字入力すると、3 回実行されます (1 回だけが望ましい)。

これを達成する方法は?正解の場合は確かに+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;
}

わかりました、これはこの回答の最終更新です。私は s を取るのが好きではないのでBOOL、これを達成するために定義タグを作成しました。kSilentTagkViolentTagUISearchBar

重要なことですが、検索バーをリセットする (つまり空にする) 場合は、いつでもタグを元にkSilentTag戻すようにしてください。

提案、セレクターを実行するために 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 に答える