再度更新
結局のところ、テーブルのヘッダーがバックグラウンドでリロードされると、何があっても検索コントローラーの前に表示されます。
これを解決するには、fetchedResultsController を無効にし (nil に設定)、検索が消えたときに必要に応じて再度遅延ロードするようにしました。
更新 - 以下の元の回答
私の場合、メインのテーブルビュー用と検索用に 1 つずつ、2 つの fetchedResultsControllers を使用しています。
セクション ヘッダーを追加するときにアニメーションを防止すると、このバグが防止されることがわかりました。したがって、searchDisplayController.active の間は、セクション変更のアニメーションを無効にするだけです。以下のコードを参照してください。
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
if (!self.reordering) {
UITableView *myTableView = controller == __fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;
UITableViewRowAnimation animation;
if (self.searchDisplayController.active) {
animation = UITableViewRowAnimationNone;
} else {
animation = UITableViewRowAnimationFade;
}
switch(type)
{
case NSFetchedResultsChangeInsert:
[myTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
break;
case NSFetchedResultsChangeDelete:
[myTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
break;
}
}
}
元の答え
他の答えは、実際にはそれ自体では機能しません。その理由は、表示されているヘッダーが searchDisplayController の tableview のヘッダーではないためです。何らかの理由でビュー階層の検索テーブル ビューの上に追加されているのは、メイン テーブルビューのヘッダーです。
searchDisplayController.active = YESのときにメインテーブルビューの更新を無効にすることで、この問題を解決しました。
私の場合、遅延ロードされたフェッチ結果コントローラーを使用しているので、次のようにしました。
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
[self.tableView reloadData];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
self.fetchedResultsController.delegate = nil;
self.fetchedResultsController = nil;
}
ただし、メインのテーブルビューで reloadData をバックグラウンドで表示したい場合、セクションヘッダーがまだ暗い領域の前に浮いているという問題があります。
誰かがこれに対するより良い解決策を持っていますか? UISearchDisplayController でカバーされている間にデータがリロードされると、viewForHeaderInSection と titleForHeaderInSection の正当なバグのようです。
私にとって最も簡単な答えは、検索ビューをオーバーライドして、バックグラウンド テーブルが表示されないようにすることです。しかし、それはアプリの「アップルらしさ」を奪います。