再次更新
事实证明,如果表格的标题在后台重新加载,无论如何它都会弹出到搜索控制器的前面。
我通过禁用 fetchedResultsController(将其设置为 nil)并在搜索消失时让它在需要时再次延迟加载来解决这个问题。
更新 - 下面的原始答案
在我的情况下,我使用两个 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;
}
但是,我仍然有一个问题,如果我想在主 tableview 上 reloadData 以便在后台看到它,节标题仍然漂浮在黑暗区域的前面。
有没有人对此有更好的解决方案?当数据被 UISearchDisplayController 覆盖时重新加载时,viewForHeaderInSection 和 titleForHeaderInSection 似乎是一个合法的错误。
对我来说最简单的答案是尝试覆盖搜索视图,这样您就看不到背景表。但这带走了应用程序的“Appleness”。