2013-09-30 3 views
4

У меня есть UICollectionView, который отображает содержимое с NSFetchedResultsController. CollectionView имеет один раздел, и в этом разделе есть заголовок. Заголовок позволяет пользователю фильтровать содержимое в виде коллекции. Делегат представления заголовка подключен к UIViewController, содержащему представление коллекции.Содержимое UICollectionView скрыто после reloadData

Как только пользователь изменяет один из параметров фильтра, заголовок вызывает сообщение его делегату. Делегат меняет предикат на fetchRequest своего NSFetchedResultsController и вызывает -[NSFetchedResultsController performFetch:]. Затем необходимо просмотреть уведомление о том, что содержимое изменилось. Это можно сделать несколькими способами, но способ, который я предпочитаю, - позвонить по телефону -[UICollectionView reloadData]. К сожалению, этот метод не работает, как и ожидалось: весь запрос коллекции исчезает, когда я вызываю этот метод. Таковы некоторые замечания, которые я сделал по этому вопросу:

  1. Все клетки и заголовок первой секции (и только) имеют их hidden флаг установлен в YES. Я попытался проследить, какой метод вызвал это, установив символическую точку останова на -[UIView setHidden:]. К сожалению, он никогда не ломается внутри подматрицы UICollectionView.
  2. collectionView:cellForItemAtIndexPath: никогда не вызывается после звонка -[UICollectionView reloadData].
  3. collectionView:viewForSupplementaryElementOfKind:atIndexPath: никогда не вызывается после звонка -[UICollectionView reloadData].
  4. numberOfSectionsInCollectionView: по-прежнему вызывается и по-прежнему возвращает правильное число (в этом случае 1).
  5. collectionView:numberOfItemsInSection по-прежнему вызывается и по-прежнему возвращает правильное число (в этом случае 1).

То, что я пытался до сих пор решить проблему:

  1. отключающий все настройки (sectionInset, itemSize) на UICollectionViewFlowLayout например
  2. Отключение всех настроек (separatorInset) на экземпляре UICollectionView
  3. имеют заголовок, добавленный как подпункт UICollectionView и устанавливающий contentInset соответственно. К сожалению, UICollectionView не любит, чтобы я закалялся с ограничениями автоматического макета и сбоями, когда я это делаю.
  4. звонок [UICollectionView reloadSections:] вместо [UICollectionView reloadData]. Это работает, но мне не нравится анимация.
  5. вручную вставлять, удалять и обновлять строки в первом разделе. Это работает до тех пор, пока контроллер представления, содержащий просмотр коллекции, находится в памяти. Как только оно отменяется, приложение вылетает с ошибкой утверждения в -[UICollectionView dealloc].

Он не чувствует себя хорошо, чтобы иметь настройки заголовка, таким образом, но, к сожалению, UICollectionView не имеет глобальный заголовок, как UITableView (tableHeaderView).

+0

Эй, нашел решение? –

+0

Нет, я не могу найти решение – datwelk

+0

Хорошо, спасибо за ответ. –

ответ

4

Попробуйте обновить их в основной поток

dispatch_async(dispatch_get_main_queue(), ^{ 
[self.collectionView reloadData]; 
}); 

он работал для меня

Смежные вопросы