4

UITableViewユーザーが入力すると(JSONサービスを使用して)入力される候補を含む検索バーがあります。これらのサービスコールは、500ミリ秒の非タイピングの遅延後に行う必要があります。ユーザーがこの500ミリ秒の期間を入力し始めた場合、キュー内の現在の通話をキャンセルする必要があり、アプリは別の通話を行う前にさらに500ミリ秒の非アクティビティを待機する必要がありafterDelayます。私performSelector:withObject:afterDelayはこの状況全体で使用しなければならないことを知っていますが、適切な条件で回避することはできません。たくさんのboolsを使ってみましたが、汚れただけです...何か助けはありますか?

4

2 に答える 2

7

NSTimerの代わりに使用しperformSelector:withObject:afterDelay:ます。でテキストが変更されたことを検出しUISearchBar、タイマーをリセットします。

-(void)viewDidLoad {

    search.delegate = self;

}

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

    [timer invalidate];

    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(callTheService) userInfo:nil repeats:NO];

}
于 2012-09-04T18:21:04.587 に答える
6

UITextFieldDelegateメソッドでの入力を検出していると仮定すると、これはどうでしょうか。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sendNetworkRequest) object:nil];
    [self performSelector:@selector(sendNetworkRequest) withObject:nil afterDelay:0.5];
    return YES;
}

- (void)sendNetworkRequest
{
    // Here immediately send the request
}

このような問題に対するこのアプローチは、NSTimerテキストがさらに入力されるかどうかを確認するために待機しているかどうかを使用したり、状態を追跡したりする必要がないことを意味するため、気に入っています。お役に立てれば!ご不明な点がございましたら、お気軽にお問い合わせください。

編集:代わりに検索バーを使用していることを確認しました。原則は同じですが、キャンセル/実行のペアリングを適切なUISearchBarDelegate方法で行うだけです。

于 2012-09-04T18:17:48.660 に答える