15

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

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

如果你们中的任何人知道可能导致此问题的原因或知道解决方法,那就太好了。

4

9 回答 9

7

再次更新

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

我通过禁用 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”。

于 2011-05-08T18:29:12.663 回答
3

Our solution is to do the following. It has only been tested in iOS 7:

  1. In viewForHeaderInSection, return nil if self.searchDisplayController.active is YES
  2. In didHideSearchResultsTableView, call [self.tableView reloadData] to reload the headers when the search table disappears
于 2013-11-12T17:58:37.263 回答
2

我在 iOS 7 中通过仅重新加载基础表中的可见行解决了这个问题。

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
   [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
}
于 2014-05-07T09:20:27.750 回答
2

我最近也遇到了这个问题......我决定的方法是在暂停的串行调度队列中对主 tableView 的更新进行排队,直到 UISearchDisplayController 隐藏 searchResultsTableView。我可能会认为这是一个错误,因为如果 searchResultsTableView 已接管该层,则部分标题不应通过主 tableView 显示。

于 2012-11-19T17:56:12.477 回答
0
[self.searchDisplayController.searchResultsTableView reloadData];
于 2015-01-14T06:46:53.310 回答
0

解决它..

在 viewDidLoad 中添加以下行

searchDisplayController.searchResultsTableView.delegate = self;
searchDisplayController.searchResultsTableView.dataSource = self;

那为我解决了它...

于 2013-12-03T11:52:46.927 回答
0

因为使用UITableViewController. self.viewis a TableViewin the UITableViewControllerandSearchDisplayControllerContainerView加到self.viewof 中UITableViewController。只需使用UIViewcontroller.

于 2015-03-31T13:00:51.410 回答
0

我的解决方案是避免在显示搜索结果时重新加载表格,然后在搜索结果被关闭时重新加载。

我必须在 UITableView reloadData 上设置一个符号断点,以查找所有导致节标题在搜索表顶部重绘的重新加载调用。

于 2015-09-01T17:54:29.527 回答
-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
}
于 2011-04-07T14:32:34.783 回答