在UISearchDisplayController后面重新加载UITableView

Eth*_*han 15 reload uitableview uisearchdisplaycontroller behind ios

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

http://img46.imageshack.us/img46/2818/screenshot20100905at140.png

如果你们中任何人知道可能导致这个问题的原因或者知道解决方法,那就太棒了.

Der*_*rek 7

再次更新

事实证明,如果桌面的标题在后台重新加载,它会在搜索控制器前弹出,无论如何.

我解决了这个问题,方法是禁用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)

  • 令人惊讶的是,但问题确实在于后台 UITableView 的实际节标题显示在 UISearchDisplayController 的 UITableView 上方。在搜索结果中滚动时,背景部分标题显示为固定,随着搜索结果在其后面上下移动而浮动在搜索结果上方。 (2认同)