UICollectionView reloadData увольняет первого ответчика в заголовке раздела - программирование
Подтвердить что ты не робот

UICollectionView reloadData увольняет первого ответчика в заголовке раздела

У меня есть UICollectionView, у которого есть заголовок раздела. В заголовке раздела есть UISearchBar. Я хочу отфильтровать содержимое в моем представлении коллекции, когда я набираю строку поиска. Я делаю это со следующим методом:

// The method to change the predicate of the FRC
- (void)filterContentForSearchText:(NSString*)searchText
{
    NSString *query = searchText;
    if (query && query.length) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@ or createdAt contains[cd] %@ or noteText contains[cd] %@ or keywords contains[cd] %@", query, query, query, query];
        [self.fetchedResultsController.fetchRequest setPredicate:predicate];
    } else {
        [self.fetchedResultsController.fetchRequest setPredicate:nil];
    }
    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle error
        NSLog(@"Error");
    }
    [self.collectionView reloadData];
}

Этот метод вызывается каждый раз при изменении текста панели поиска. Линия [self.collectionView reloadData] скрывала клавиатуру для каждого символа. Возможно ли перезагрузить только данные в представлении UICollection и не перезагружать дополнительные представления, такие как заголовки заголовков разделов?

Данные в моей коллекцииView поступают из NSFetchResultController.

Я очень доволен тем, как работает мой пользовательский интерфейс, если есть простой способ НЕ перезагрузить заголовок раздела, тогда это было бы здорово!

4b9b3361

Ответ 1

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

Итак:

  • Раздел 0
    • Заголовок
      • Панель поиска (или другие текстовые поля)
    • Ряды
      • (нет)
  • Раздел 1
    • Заголовок
      • Создать пустой UICollectionReusableView и переопределить... sizeForItemAtIndexPath: (NSIndexPath *) indexPath для возврата CGSizeZero
    • Ряды
      • Ваши фактические строки, которые первоначально были бы отправлены с разделом 0

Затем нам нужно перезагрузить данные:

[collectionView reloadSections:[NSIndexSet indexSetWithIndex:1]];

Ваша панель поиска или текстовые поля должны сохранять фокус во время ввода пользователем, и вы можете обновлять результаты в фоновом режиме.

Ответ 2

Пробовал ли вы один из этих вариантов?

Чтобы перезагрузить только новые элементы

    [self.collectionView reloadItemsAtIndexPaths:indexPaths];

Чтобы перезагрузить полный раздел

    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];

Или, если это не сработает... сделайте поиск ответчиком снова после ваших обновлений

    [self.collectionViewPackages performBatchUpdates:^{
        [self.collectionView reloadData];
    } completion:^(BOOL finished) {
        [self.searchBar becomeFirstResponder];
    }];