0

私は UITableViewController add with InterfaceBuilder を使用して UIViewController に UISearchDisplayController と UISearchBar を追加しようとしています。これは私のコードです:

@interface MyClass () <UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate, UISearchDisplayDelegate>

{
UISearchBar *searchBar;
UISearchDisplayController *searchDisplayController;
}

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MyClass

- (void)viewDidLoad
{
UINib *myCellNib = [UINib nibWithNibName:@"MyCell_iPhone" bundle:[NSBundle mainBundle]];
[self.tableView registerNib:myCellNib forCellReuseIdentifier:CellIdentifier];
[self.tableView setDataSource:self];
[self.tableView setDelegate:self];
[self.tableView setRowHeight:84];
[self.tableView setSectionHeaderHeight:45];

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, -44 , 320, 44)];
searchBar.delegate = self;
[searchBar setBackgroundImage:[UIImage imageNamed:@"NavBar.png"]];

[self.view addSubview:searchBar];

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;

[searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern_bg"]]];
[searchDisplayController.searchResultsTableView setSeparatorColor:[UIColor clearColor]];
[searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[searchDisplayController.searchResultsTableView registerNib:myCellNib forCellReuseIdentifier:CellIdentifier];
[searchDisplayController.searchResultsTableView setRowHeight:84];
[searchDisplayController.searchResultsTableView setSectionHeaderHeight:0];
}

#pragma mark Content Filtering
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
// Update the filtered array based on the search text and scope.
// Remove all objects from the filtered search array
[self.filteredInfo removeAllObjects];
[self doLocalSearch:searchText];

}


#pragma mark - UISearchDisplayController Delegate Methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
// Tells the table data source to reload when text changes
[self filterContentForSearchText:searchString scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
// Tells the table data source to reload when scope bar selection changes
[self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCell_iPhone *cell = (MyCell_iPhone *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (tableView == searchDisplayController.searchResultsTableView)
{
 .....code to set information in cell
 } else {
 .....code to set information in cell
 }

return cell;
}

私のメイン UITableView は完全に機能しますが、代わりに searchDisplayController.searchResultsTableView にこの問題があります。最初に検索をすべて正常に実行すると、MyCustom Cell が表示され、uitableview に挿入した背景が表示されるので、すべてが機能するので、次に押します[キャンセル] ボタンをクリックして検索を閉じ、検索ビューを再度開き、別の検索を行うと、次のエラーが表示されます。

*** Assertion failure in -[UISearchResultsTableView _configureCellForDisplay:forIndexPath:]

問題がどこにあるかを確認するために多くのブレークポイントを挿入しましたが、ここにあることがわかりました:

MyCell_iPhone *cell = (MyCell_iPhone *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

2 回目の検索で値が nil になり、テーブル ビューの背景が失われ、従来の白い背景が返されてクラッシュします。何が問題なのですか? メインのuitableviewが完全に機能することを繰り返します...

4

1 に答える 1

2

このデリゲート メソッドに UISearchDisplayController テーブル ビューのカスタム設定を挿入する必要があります。

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
[searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern_bg"]]];
[searchDisplayController.searchResultsTableView setSeparatorColor:[UIColor clearColor]];
[searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
UINib *myCellNib = [UINib nibWithNibName:@"MyCell_iPhone" bundle:[NSBundle mainBundle]];
[searchDisplayController.searchResultsTableView registerNib:myCellNib forCellReuseIdentifier:CellIdentifier];
[searchDisplayController.searchResultsTableView setRowHeight:84];
[searchDisplayController.searchResultsTableView setSectionHeaderHeight:0];
}
于 2013-08-22T11:27:20.923 に答える