Перезагрузка UITableView за UISearchDisplayController

Я столкнулся с этим действительно странным явлением, которое я не могу понять. У меня есть UITableViewController, который управляет UITableView. Довольно просто. У меня также есть UISearchDisplayController для поиска содержимого табличного представления. Функция поиска сможет удалять элементы содержимого, отображаемого в виде таблицы. Поэтому, если пользователь хочет удалить один из элементов, найденных во время поиска, я хочу не только перезагрузить представление таблицы UISearchDisplayController, но и табличное представление UITableViewController. Когда я это делаю, разделы обычного представления таблицы выходят и отображаются над UISearchDisplayController. Это действительно странно. Я думаю, что лучший способ объяснить это с помощью изображения:

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

Если кто-то из вас знает, что могло бы вызвать эту проблему или знать обходное решение, это было бы фантастически.

Ответы

Ответ 1

ОБНОВЛЕНО СНОВА

Как оказалось, если заголовок таблицы перезагружается в фоновом режиме, он появляется перед контроллером поиска независимо от того, что.

Я решил это, отключив fetchedResultsController (установив его на нуль) и позволяя ему лениво загружаться, когда это необходимо, когда поиск исчезает.

ОБНОВЛЕНО - исходный ответ ниже

В моем случае я использую два 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;
        }
    }
}

ОРИГИНАЛЬНЫЙ ОТВЕТ

Другой ответ на самом деле не работает сам по себе. Причина в том, что заголовок, который отображается, не является заголовком в представлении tableDisplayController. Это заголовок из основного табличного представления, который по какой-либо причине добавляется над представлением таблицы поиска в иерархии представлений.

Я решил эту проблему, отключив обновления в главном представлении таблицы, в то время как 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;
}

Тем не менее, у меня все еще есть проблема, что если я хочу перезагрузить Data в главном представлении таблицы, так что это видно в фоновом режиме, заголовки разделов все еще плавают перед темной областью.

У кого-нибудь есть лучшее решение для этого? Это похоже на законную ошибку для viewForHeaderInSection и titleForHeaderInSection, когда данные перезагружаются, когда они покрываются UISearchDisplayController.

Самый простой ответ для меня - попытаться переопределить поиск, чтобы вы не могли видеть таблицу фона. Но это отвлекает от "Appleness" приложения.

Ответ 2

Наше решение состоит в том, чтобы сделать следующее. Он был протестирован только в iOS 7:

  • В viewForHeaderInSection верните нуль, если self.searchDisplayController.active - YES
  • В didHideSearchResultsTableView вызовите [self.tableView reloadData], чтобы перезагрузить заголовки, когда таблица поиска исчезает.

Ответ 3

В последнее время я столкнулся с этим... Подход, который я решил, заключался в том, чтобы очереди в главном tableView в приостановленной очереди последовательной отправки, пока UISearchDisplayController не скрывает searchResultsTableView. Вероятно, я считаю это ошибкой, так как заголовки разделов не должны отображаться через главный tableView, если searchResultsTableView занял этот уровень.

Ответ 4

Я решил это в iOS 7, только перезагружая видимые строки в базовой таблице.

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
   [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
}

Ответ 5

Исправлено.

Добавьте следующие строки в viewDidLoad

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

Это исправило это для меня...

Ответ 6

[self.searchDisplayController.searchResultsTableView reloadData];

Ответ 7

Из-за использования UITableViewController. self.view является TableView в UITableViewController, а SearchDisplayController ContainerView добавляется к self.view из UITableViewController. Просто используйте UIViewcontroller.

Ответ 8

Мое решение состояло в том, чтобы не перезагружать таблицу, если отображались результаты поиска, а затем перезагружались, когда результаты поиска были отклонены.

Мне пришлось установить символическую точку останова в reloadData UITableView, чтобы найти все вызовы перезагрузки, из-за которых заголовки разделов перерисовываются поверх таблицы поиска.

Ответ 9

Надеюсь, вы это догадались, но на всякий случай кто-то наткнулся на этот вопрос: это, вероятно, происходит потому, что ваш 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
}