Eth*_*han 15 reload uitableview uisearchdisplaycontroller behind ios
我遇到了这个奇怪的现象,我无法弄明白.我有一个管理UITableView的UITableViewController.很简单.我还有一个UISearchDisplayController用于搜索表视图的内容.搜索功能将能够删除表视图显示的内容项.因此,如果用户选择删除,他们发现,当搜寻的项目之一,我想不仅重新加载UISearchDisplayController的表视图也是的UITableViewController的表视图.当我这样做时,常规表视图的部分弹出并显示在UISearchDisplayController上方.这真的很奇怪.我认为解释它的最好方法是使用图像:

如果你们中任何人知道可能导致这个问题的原因或者知道解决方法,那就太棒了.
再次更新
事实证明,如果桌面的标题在后台重新加载,它会在搜索控制器前弹出,无论如何.
我解决了这个问题,方法是禁用fetchedResultsController(将其设置为nil)并在搜索消失时让它在需要时再次加载.
更新 - 原始答案如下
在我的情况下,我使用两个fetchedResultsControllers一个用于主tableview,一个用于搜索.
我发现在添加节标题时阻止动画可以防止此错误.因此,当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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
原始答案
另一个答案实际上并不适用于它自己.原因是,显示的标题不是searchDisplayController的tableview中的标题.它是主表视图中的标题,由于某种原因,它被添加到视图层次结构中的搜索表视图上方.
我通过在searchDisplayController.active = YES时禁用主表视图的更新来解决了这个问题.
在我的情况下,我正在使用一个延迟加载的fetched结果控制器,所以我这样做:
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
[self.tableView reloadData];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
self.fetchedResultsController.delegate = nil;
self.fetchedResultsController = nil;
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然有一个问题,如果我想在主tableview上重新加载数据,以便在后台看到它,节标题仍然浮在黑暗区域的前面.
有人有更好的解决方案吗?当UISearchDisplayController覆盖数据时,重新加载数据似乎是viewForHeaderInSection和titleForHeaderInSection的合法错误.
对我来说最简单的答案是尝试覆盖搜索视图,以便您无法看到背景表.但这取消了应用程序的"Appleness".
Cam*_*ert -1
希望您现在已经弄清楚了这一点,但以防万一有人偶然发现这个问题:这可能会发生,因为您的 UITableViewController 是搜索表以及主表的数据源/委托。也就是说,您可能对两个表视图执行相同的 UITableViewDelegate/DataSource 方法,并且为两个表返回相同的节标题。确保您单独处理搜索结果表:
- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section {
if (aTableView == [[self searchDisplayController] searchResultsTableView]) {
return nil;
}
// Return a title appropriate for self.tableView here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5991 次 |
| 最近记录: |