Вот то, что я решил сделать, если кто-то не видит в нем недостаток или не может придумать лучшую идею.
В контроллере представления, который управляет tableView, я добавил свойство
NSMutableArray *viewsForSectionHeaders;
Затем я изменил свой tableView: viewForHeaderInSection:
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
SearchResult *result = [[[[self.fetchedResultsController sections] objectAtIndex:section] objects] objectAtIndex:0];
ResultsHeaderView *header;
if (section < [viewsForSectionHeaders count]) {
header = [viewsForSectionHeaders objectAtIndex:section];
}
else {
header = [[[ResultsHeaderView alloc] initWithFrame:CGRectMake(0, 0, defaultResultsHeaderSize.width, defaultResultsHeaderSize.height)] autorelease];
[viewsForSectionHeaders addObject:header];
}
header.text = result.searchUsed.keywords;
header.searchTermsEntity = result.searchUsed;
header.resultDelegate = self;
header.section = section;
return header;
}
В этом случае у меня есть массив представлений заголовка. Это не сразу очевидно, но всякий раз, когда fetchedResultsController обновляется, он может «не соответствовать» ранее связанным заголовкам с разделами, отличными от того, к которым они были изначально сопоставлены. Но это на самом деле не имеет значения, поскольку свойства заголовка (text, searchTermsEntity, resultDelegate и section) сбрасываются в приведенном выше коде.
Итак, до тех пор, пока я не увижу что-то, что пропустил, похоже, что он служит только для создания экземпляров представлений заголовков, когда они необходимы, и повторного использования тех, которые уже были созданы.
(Обратите внимание, что я переместил авторелиз внутри, где размещено представление. У меня была ошибка, когда я ссылался на нулевой объект, и это исправило его. Кроме того, теперь, когда я думаю об этом, произойдет авторелиз в возврате оператор повторил бы авторелиз на объекте несколько раз, если бы он был создан при предыдущем обращении к этому коду. Я не знаю, является ли это реальной проблемой, но это было легко исправить, пока я занимался этим .)
Прямо сейчас я не удаляю разделы, поэтому мне не нужно беспокоиться об освобождении представлений заголовков. Но если я действительно удаляю разделы, это означает, что представление заголовка должно быть удалено и из массива viewsForSectionHeaders.