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

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

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

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

9 ответов

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

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

Я решил это, отключив 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. Это заголовок основного табличного представления, который по какой-то причине добавляется над табличным поиском в иерархии представлений.

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

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

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

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

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

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

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

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

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

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

Починил это..

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

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

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

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

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

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