2010-06-19 4 views
9

J'ai un petit problème avec mon UITableViewController ou NSFetchedResultsController. Je ne suis pas sûr quel est le problème soure mais je suppose que c'est le UITableViewController. Comme je l'ai dit, j'utilise un NSFetchedResultsController pour remplir mes données dans un UITableViewController. Les données sont triées par date et sont également affichées dans des sections par date-année, par ex. Mai 2010/Juin 2010/et ainsi de suite. Ceci est affiché comme en-tête de section. Maintenant, lorsque j'ajoute de nouvelles données, il utilise automatiquement la date actuelle par défaut, mais si je veux utiliser une date, celle-ci ne figure pas actuellement dans la liste des sections, par ex. Avril 2010 (actuellement mai et juin dans la liste), alors ceci n'est pas affiché correctement. Ce n'est que lorsque je quitte l'application et que je la relance, les nouveaux en-têtes de section s'affichent et tout va bien.Comment actualiser un UITableViewController ou un NSFetchedResultsController?

Donc je dois d'une manière ou d'une autre être capable de rafraîchir ma liste ou de la mettre à jour. En l'ajoutant simplement au contexte et en le modifiant, il ne semble pas le mettre à jour.

Encore une fois, je ne suis pas sûr de ce que j'ai besoin de mettre à jour, si c'est mon objet NSFetchedResultsController ou le UITableViewController.

MISE À JOUR # 1:

Je pensais juste qu'il ya une exception dans cette méthode:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    [self.tableView endUpdates]; 

} 

C'est là que je déplace les données:

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

    UITableView *tableView = self.tableView; 

    switch(type) 
    { 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
     // [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 

      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
      [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 

Cette méthode est assez beaucoup tiré de l'exemple CoreDataBooks d'Apple. Et c'est l'erreur:

Erreur d'application grave. Une exception a été interceptée par le délégué de NSFetchedResultsController au cours d'un appel à -controllerDidChangeContent :. *** - [NSMutableArray removeObjectAtIndex:]: index 1 au-delà de limites [0 .. 0] avec userInfo (null)

Et après cela, le mode d'édition (où le bouton de suppression apparaît) ne fonctionne pas plus.

Merci.

Répondre

0

Vous devez implémenter les méthodes de délégation controller:didChangeSection:atIndex:forChangeType:. Dans celui-ci, envoyez les messages insertSections:withRowAnimation:, deleteSections:withRowAnimation: et reloadSections:withRowAnimation: à votre vue de table en fonction du type de changement signalé.

+0

C'est ce que j'ai ajouté à la question ..., l'exception vient après cela. – elementsense

+0

Vous ne mentionnez même pas 'controller: didChangeSection: atIndex: forChangeType:'. –

+0

isnt -controller: didChangeObject: atIndexPath: forChangeType: newIndexPath faisant la même chose? – elementsense

15

Ok, regarde comme je l'ai trouvé une solution, je saute juste ces

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

et toujours faire ça.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 

[self.tableView reloadData]; 

} 

je donnerai évidemment cette logique un peu plus, puisque le problème seulement quand j'occures veux déplacer mes données dans une section qui ne préexiste pas. Jusqu'à ce que quelqu'un puisse me donner une vraie solution, je vais aller avec celui-ci.

+3

J'ai parlé à un ingénieur d'Apple à la WWDC à ce sujet. Il a dit que c'était un bug dans UITableView (qui a été corrigé dans 4.0). Si vous êtes sur <4.0, appelez 'reloadData' comme ça. Si vous êtes sur> = 4.0, faites comme la documentation dit. –

+0

merci, fonctionne parfaitement .. – tesmojones

+1

Vous monsieur, vient de résoudre un problème qui saignait dans sa 6ème heure. Si je pouvais upvote deux fois, je le ferais. – Cyprus106

2

Adoption du correctif par Apple dans iPhoneCoreDataRecipes en version 1.2, la meilleure chose à faire est de remplacer

// Reloading the section inserts a new row and ensures that titles are updated appropriately. 
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

avec

[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

(FileMerge est votre ami!)

Remarque, il y a une autre solution dans la version 1.2 qui empêche de se écraser erratique lors de la création de nouvelles entrées. J'avais signalé cela et il a été réparé dans les deux semaines. Je vous encourage à déposer des rapports de bug avec Apple. Ils sont beaucoup plus réactifs que vous ne le pensez, et vous pouvez vous attendre à obtenir la meilleure solution possible.

Questions connexes