テーブル ビューに検索バーを実装しました。すべてが大丈夫でした。カスタマイズの理由から、両方をビュー コントローラーに埋め込みました。この時点から、最初の文字を検索バーに入力した後、アプリがフリーズします。その後、アプリを一時停止/一時停止解除すると、デバッガーでさまざまなポイントが表示されるため、アプリが実行されているように見え、入力した文字がキーボードで強調表示されて (大きく) 表示されます。少し遊んだ後、初めて検索バーを選択したときに何も入力せずにキャンセルを押すと、問題が解決することがわかりました。この後、期待どおりに検索バーを使用できます。
数日間インターネットを検索しましたが、この問題を解決するためのヒントは見つかりませんでした。だからどんな助けも大歓迎です。
ここに私のコード:
-(void)viewDidLoad
[super viewDidLoad];
UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PhaseHintergrund"]];
[tempImageView setFrame:self.tableView.frame];
self.tableView.backgroundView = tempImageView;
self.searchItem = nil;
[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"Suchleiste"]forState:UIControlStateNormal];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,320,44)];
searchBar.placeholder = @"Symptomsuche";
UIImage *myImage = [UIImage imageNamed: @"NavbarTransparent"];
searchBar.backgroundImage = myImage;
searchBar.delegate = self;
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchController.searchResultsTableView.separatorColor = self.tableView.separatorColor;
self.searchController.searchResultsTableView.backgroundView = tempImageView;
self.searchController.searchResultsTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self.tableView reloadData];
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = nil;
cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell2" forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
UITextView *symptom = (UITextView*) [cell viewWithTag:2];
symptom.text = (NSString*)[object valueForKey:@"name"];
-(BOOL)searchDisplayController:(UISearchDisplayController *)_controller shouldReloadTableForSearchString:(NSString *)searchString
self.searchItem = searchString;
self.fetchedResultsController = nil;
return YES;
-(void)searchDisplayController:(UISearchDisplayController *)_controller willUnloadSearchResultsTableView:(UITableView *)tableView
self.searchItem = nil;
self.fetchedResultsController = nil;
[self.tableView reloadData];
編集 すべての UISearchDisplayController デリゲート メソッドでブレークポイントを設定すると、エラーが発生した場合 (以前にキャンセルせずに検索バーを初めて使用した場合)、メソッド searchDisplayController: didLoadSearchResultsTableView: が実行されないことがわかりました。そのため、現時点ではアクティブなテーブルビューがなく、おそらく問題/エラーにつながるようです。
問題は、初期化で何が欠けているか、間違っているか、検索をキャンセルすると修正されるかということです。