2

テーブル ビューに検索バーを実装しました。すべてが大丈夫でした。カスタマイズの理由から、両方をビュー コントローラーに埋め込みました。この時点から、最初の文字を検索バーに入力した後、アプリがフリーズします。その後、アプリを一時停止/一時停止解除すると、デバッガーでさまざまなポイントが表示されるため、アプリが実行されているように見え、入力した文字がキーボードで強調表示されて (大きく) 表示されます。少し遊んだ後、初めて検索バーを選択したときに何も入力せずにキャンセルを押すと、問題が解決することがわかりました。この後、期待どおりに検索バーを使用できます。

数日間インターネットを検索しましたが、この問題を解決するためのヒントは見つかりませんでした。だからどんな助けも大歓迎です。

ここに私のコード:

-(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: が実行されないことがわかりました。そのため、現時点ではアクティブなテーブルビューがなく、おそらく問題/エラーにつながるようです。

問題は、初期化で何が欠けているか、間違っているか、検索をキャンセルすると修正されるかということです。

4

2 に答える 2

1

が呼び出されるたび-searchDisplayController:shouldReloadTableForSearchString:に、新しいフェッチ済み結果コントローラーを作成し、テーブル ビューをリロードします。パフォーマンスのために、その方法を頻繁に行っている可能性があります。

于 2013-08-23T18:11:20.560 に答える
0

その間、問題の回避策を見つけましたが、なぜそれが機能しているのかまだわかりません。viewDidLoad では、初期化後に次の行を追加しました。

    [self searchDisplayController:self.searchController didLoadSearchResultsTableView:self.searchController.searchResultsTableView];

これで、検索バーも最初の検索で機能するようになりました。

于 2013-08-28T18:41:56.840 に答える