AQGridView, поддерживаемый NSFetchedResultsController - PullRequest
10 голосов
/ 02 декабря 2011

Я пытаюсь реализовать AQGridView, который использует выбранный контроллер результатов в качестве источника данных.

Я не совсем уверен, как обрабатывать методы делегата NSFetchedResultsController, используя вид сетки; а именно содержание меняется. Я понимаю, как использовать FRC для других делегатов источника данных представления сетки.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 3 ]

7 голосов
/ 21 января 2012

Результат должен выглядеть примерно так:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
  [gridView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
       atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
  switch(type)
  {
    case NSFetchedResultsChangeInsert:
      break; 
    case NSFetchedResultsChangeDelete:
      break;
  }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath
{

  ChannelPageViewController *currentPageController, *destinationPageController;

  NSIndexSet * indices = [[NSIndexSet alloc] initWithIndex: indexPath.row];
  NSIndexSet *newIndices = [[NSIndexSet alloc] initWithIndex:newIndexPath.row];

  switch(type) {
      case NSFetchedResultsChangeInsert:
        [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone];
      break;

      case NSFetchedResultsChangeDelete:
        [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
        break;

      case NSFetchedResultsChangeUpdate:
        [gridView reloadItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
        break;

      case NSFetchedResultsChangeMove:
        [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
        [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone];
        break;
   }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
  [gridView endUpdates];
  if ([[frc fetchedObjects] count] == 1) {
    [gridView reloadData];
  }

}
0 голосов
/ 29 декабря 2011

Поскольку AQGridView не имеет разделов, лучший способ справиться с этим - реализовать методы делегата NSFethcedresultscontroller и игнорировать любой код для случаев, связанных с обновленными разделами. Также убедитесь, что вы инициализируете запрос fetch без sectionNameKeyPath.

Затем просто следуйте обычному шаблону для обновления строк, но используйте NSIndexSet вместо NSIndexPath и InsertItemAtIndicies / DeleteItemAtIndicies вместо insertRowAtIndexPath / deleteRowAtIndexPath

Я перевожу свой AQGridView в CoreData, поэтому я буду публиковать обновления для своего ответа, как только закончу ...

0 голосов
/ 24 декабря 2011

Когда содержимое меняется, я делаю

[self.gridView reloadData];

или что-то подобное в вашем случае.Это точно так же, как с табличным представлением.

...