Il ya un problème avec le modèle de base de données d'application basés sur la navigation dans la version 3.0. Dans le courant de 3.1 beta, le problème a été partiellement (mais pas entièrement) résolu (ne peut pas donner de détails à cause de la LDN, désolé), mais nous espérons qu'il sera corrigé dans la version finale de 3,1.
Si vous utilisez le modèle de 3.0 et exécuter l'application exemple, l'application se bloque si vous essayez de supprimer le dernier ou le rang seulement dans l'application.
Le problème est ici:
Qu'est-ce qui arrive est que l'objet est supprimé à partir du contexte ici:
il provoque le contrôleur Fetched Résultats pour supprime l'objet de son jeu de résultats et le tableau correspondant. Ainsi, lorsque, quelques lignes plus tard, quand il tente de supprimer la rangée de la table:
La ligne qu'il essaie de supprimer n'est plus là.
La solution à cela, cependant, n'est pas évidente. En fait, je ne figure pas ci moi-même. Dans le modèle 3.0, la méthode suivante est commentée:
La première chose que vous devez faire est décommentez cette méthode. Vous voulez être obtenir des notifications de changement de votre contrôleur des résultats affichés. Cependant, si nous le laissons tel quel, nous allons commencer à obtenir que le même problème quand on supprime toutes les lignes, au lieu de simplement quand nous supprimer la dernière ligne ou seulement. Pour résoudre ce problème, vous devez ajouter une ligne de code à la méthode décommentée (c'est en gras):
Une fois que vous avez fait ce changement, vous devriez être bon d'aller. En fait, vous voudrez peut-être d'aller modifier le code dans le modèle de projet en faisant le changement dans le fichier appelé RootViewController.m à l'adresse suivante (en supposant que vous avez installé les outils de dev dans l'emplacement par défaut:
Merci à l'iPhone Developer Rod Brown des TheBarcodeProject pour moi pointant dans la bonne direction sur cette question!
Si vous utilisez le modèle de 3.0 et exécuter l'application exemple, l'application se bloque si vous essayez de supprimer le dernier ou le rang seulement dans l'application.
Le problème est ici:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
// Delete the managed object for the given index path
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
// Save the context.
NSError *error;
if (![context save:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
}Qu'est-ce qui arrive est que l'objet est supprimé à partir du contexte ici:
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];il provoque le contrôleur Fetched Résultats pour supprime l'objet de son jeu de résultats et le tableau correspondant. Ainsi, lorsque, quelques lignes plus tard, quand il tente de supprimer la rangée de la table:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];La ligne qu'il essaie de supprimer n'est plus là.
La solution à cela, cependant, n'est pas évidente. En fait, je ne figure pas ci moi-même. Dans le modèle 3.0, la méthode suivante est commentée:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
[self.tableView reloadData];
}La première chose que vous devez faire est décommentez cette méthode. Vous voulez être obtenir des notifications de changement de votre contrôleur des résultats affichés. Cependant, si nous le laissons tel quel, nous allons commencer à obtenir que le même problème quand on supprime toutes les lignes, au lieu de simplement quand nous supprimer la dernière ligne ou seulement. Pour résoudre ce problème, vous devez ajouter une ligne de code à la méthode décommentée (c'est en gras):
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
if (!self.tableView.editing)
[self.tableView reloadData];
}Une fois que vous avez fait ce changement, vous devriez être bon d'aller. En fait, vous voudrez peut-être d'aller modifier le code dans le modèle de projet en faisant le changement dans le fichier appelé RootViewController.m à l'adresse suivante (en supposant que vous avez installé les outils de dev dans l'emplacement par défaut:
/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application/Navigation-based Application/Navigation-based Core Data Application/Classes
Merci à l'iPhone Developer Rod Brown des TheBarcodeProject pour moi pointant dans la bonne direction sur cette question!
Aucun commentaire:
Enregistrer un commentaire