4

IBのカスタムのヘッダーにUISearchDisplayController正しく接続されています。UITableViewただし、何かを検索するとsearchResultsTableView「結果がありません」と表示されるだけで、コードが間違っている場所を見つけることができないようです。

searchResults財産

- (NSMutableArray *)searchResults {
    if (!_searchResults) {
        _searchResults = [[NSMutableArray alloc] initWithCapacity:self.listingPreviews.count];
    }

    return _searchResults;
}

テーブル ビュー データ ソース メソッド

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSInteger numberOfRows = 0;

    if (tableView == self.tableView) {
        numberOfRows = self.listingPreviews.count;
    } else {
        numberOfRows = self.searchResults.count;
    }

    return numberOfRows;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Listing";
    ListingPreviewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[ListingPreviewTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell.
    if (tableView == self.tableView) {
        cell.listingPreview = [self.listingPreviews objectAtIndex:indexPath.row];
    } else {
        NSLog([[self.searchResults objectAtIndex:indexPath.row] title]);
        cell.listingPreview = [self.searchResults objectAtIndex:indexPath.row];
    }

    return cell;
}

Search Bar Delegate メソッド

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    NSInteger searchTextLength = searchText.length;

    for (ListingPreview *listingPreview in self.listingPreviews) {
        if ((listingPreview.title.length >= searchTextLength) && ([listingPreview.title rangeOfString:searchText].location != NSNotFound)) {
            [self.searchResults addObject:listingPreview];
        }
    }
}
4

2 に答える 2

8

代わりにこれを試してください:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Listing";
ListingPreviewTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell.
if (tableView == self.tableView) {
    cell.listingPreview = [self.listingPreviews objectAtIndex:indexPath.row];
} else {
    NSLog([[self.searchResults objectAtIndex:indexPath.row] title]);
    cell.listingPreview = [self.searchResults objectAtIndex:indexPath.row];
}

return cell;

}

変更が適用されたことに注意してください:

ListingPreviewTableViewCell *cell = [ self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

このようにして、UISearchDisplayController によって作成されたものではなく、独自の tableView からセルをデキューします。

于 2013-01-02T05:46:05.750 に答える
0

あなたのコードには、searchDisplayControllerにsearchResultTableViewのリロードを強制するものは何もないようです。

標準的なアプローチは、UISearcDisplayController'sデリゲートを設定し(プロトコルに注意してください - UISearchDisplayDelegate)、実装することです– searchDisplayController:shouldReloadTableForSearchString:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

    // perform your search here and update self.searchResults
    NSInteger searchStringLength = searchString.length;

    for (ListingPreview *listingPreview in self.listingPreviews) {
        if ((listingPreview.title.length >= searchStringLength) && ([listingPreview.title rangeOfString:searchString].location != NSNotFound)) {
            [self.searchResults addObject:listingPreview];
        }
    }

    // returning YES will force searchResultController to reload search results table view
    return YES;
}
于 2012-07-17T01:00:21.330 に答える