Web サービスからの非同期結果を処理する検索ディスプレイ コントローラーをセットアップしようとしています。基本的な部分は整っていますが、理解できない非常に奇妙な問題に遭遇しました。
非同期の検索表示コントローラーを装備するように思えますが、実際には次の 2 つのことを行う必要があります。
- searchDisplayController:shouldReloadTableForSearchString に対して NO を返す、および
- searchBarSearchButtonClicked を処理し、テーブルのリロードを開始します。
私はこれらの両方を行っていますが、私が見ているのは、#1 に従って NO を返しているにもかかわらず、検索バーに入力された最初の文字で検索ディスプレイ コントローラーがテーブルをリロードしていることです。入力された後続の文字ではリロードされません。
だから、私の質問は、ユーザーが入力している間に検索ディスプレイコントローラーがテーブルをリロードしようとしないようにするにはどうすればよいですか? (具体的には、最初に入力した文字)
この問題が他のいくつかの質問の一部として言及されているのを見てきましたが、問題に対する直接的な回答は見たことがありません。それを回避するためにたくさんの UI マングリングに頼る前に、何が起こっているのか、何が間違っているのかを理解したいと思います。
これは、問題を示すために私のコードを簡単に要約したものです。これを実行して検索バーに「abcde」と入力すると、「a」と入力した後に結果が「a #0」、「a #2」などとして表示されます。検索ボタンを押すまで、結果は再び更新されません。次に、「abcde #0」、「abcde #1」などと表示されます。もちろん、検索ボタンを押すまでは何も起こりません。
#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
return NO;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
return NO;
}
#pragma mark -
#pragma mark UISearchBarDelegate Methods
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self.searchDisplayController.searchResultsTableView reloadData];
}
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [self.searchDisplayController.searchBar.text stringByAppendingFormat:@" #%d", indexPath.row];
return cell;
}
ありがとう!(ちなみに、これは私がここで尋ねた最初の質問です。エチケットのポイントを見逃している場合はお知らせください:)