5

サーバーが検索クエリを処理している間、「結果なし」というテキストを表示したくありません。

ここに画像の説明を入力

ラベルを含むテーブル セルの正確な座標を把握し、それをカバーしようとしました。

self.noResultsCoverView = [[[UIView alloc] initWithFrame:CGRectMake(
    0.0, 
    44.0, 
    320.0, 
    43.0
)] autorelease];
self.noResultsCoverView.backgroundColor = [UIColor whiteColor];
[self.searchDisplayController.searchResultsTableView addSubview:self.noResultsCoverView];

残念なことに、私のカバーは表ビューの上にありましたが、ラベルの下にありました。ラベルの上にカバーが必要です。searchResultsTableView::bringSubviewToFrontうまくいかなかったので、ラベルはの子ではないと私は信じていsearchResultsTableViewます。

ところで、このスタックオーバーフローの回答は私にとってはうまくいきません。最初の検索では機能しますが、その後の検索では奇妙な黒いカバーが点滅します。

4

4 に答える 4

20

これは適切に機能するはずです。少なくとも 1 つのセルを返すコード:

BOOL ivarNoResults; // put this somewhere in @interface or at top of @implementation
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        if (filteredList.count == 0) {
            ivarNoResults = YES;
            return 1;
        } else {
            ivarNoResults = NO;
            return [filteredList count];
        }
    }
    // {…}
    // return the unfiltered array count
}

クリーンセルを「表示」する場合:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (tableView == self.searchDisplayController.searchResultsTableView && ivarNoResults) {
        static NSString *cleanCellIdent = @"cleanCell";
        UITableViewCell *ccell = [tableView dequeueReusableCellWithIdentifier:cleanCellIdent];
        if (ccell == nil) {
            ccell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cleanCellIdent] autorelease];
            ccell.userInteractionEnabled = NO;
        }
        return ccell;
    }

    // {…}
}
于 2012-08-02T08:39:10.093 に答える
6

これを回避する最も簡単な方法は、クエリの進行中に numberOfRowsInSection で 1 を返し、ダミー セルを空のままにするか、非表示プロパティを YES に設定して非表示にすることです。

于 2012-07-27T18:52:05.740 に答える
3

これを試してみてください

UISearchDisplayController デリゲートでこれを行います:=

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.001);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        for (UIView* v in self.searchDisplayController.searchResultsTableView.subviews) {
            if ([v isKindOfClass: [UILabel class]] && 
                [[(UILabel*)v text] isEqualToString:@"No Results"]) {
                [(UILabel*)v setText:@""];
                break;
            }
        }
    });
    return YES;
}
于 2012-07-30T05:29:27.587 に答える
1

UISearchDisplayControllerがあり、検索バーがアクティブな場合、データ ソースとデリゲート メソッドUITableViewに渡される引数UITableViewは、実際には tableView オブジェクトではなく、UISearchDisplayController「ライブ」検索結果を表示することを目的とした によって管理される tableView であることを認識する必要があります。 (たとえば、メイン データ ソースからフィルタリングされた結果など)。

これはコードで簡単に検出でき、どの tableView オブジェクトが要求しているかに応じて、デリゲート/データ ソース メソッドから適切な結果を返すことができます。

例えば:

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
{
    if (tv == self.searchDisplayController.searchResultsTableView) {
        // 表示される検索結果のセクションの行数を返します。
        // 「No results」を抑制するためにゼロ以外の値を返す
    } そうしないと {
        // メイン データ ソースのセクションの行数を返します
    }
}

要点は、データ ソースとデリゲート メソッドが2 つのテーブルを提供しており、どのテーブルがデータまたはデリゲートを要求しているかを確認できる (チェックする必要がある) ことです。

ちなみに、「結果なし」はUISearchDisplayController、デリゲートが行がないと言ったときに表示される背景画像によって提供されると思います...最初の空白と2番目の空白の2行のテーブルは表示されませんテキスト「結果なし」。少なくとも、それがそこで起こっていると思います。

于 2012-07-27T19:53:29.340 に答える