2010-04-13 5 views
0

J'ai du mal à ajouter un nouvel élément à ma vue de table avec les données de base. Voici la brève logique dans mes codes. Dans ma classe de ViewController, j'ai un bouton pour trigle le mode d'édition:Ajouter un nouvel élément à UITableView et Core Data en tant que source de données?

- (void) toggleEditing { 
    UITableView *tv = (UITableView *)self.view; 
    if (isEdit) // class level flag for editing 
    { 
    self.newEntity = [NSEntityDescription insertNewObjectForEntityName:@"entity1" 
     inManagedObjectContext:managedObjectContext]; 
    NSArray *insertIndexPaths = [NSArray arrayWithObjects: 
     [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here. 
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView setEditing:YES animated:YES]; // enable editing mode 
    } 
    else { ...} 
} 

Dans ce bloc de codes, j'ai ajouté un nouvel élément à mon contexte d'objet géré courant d'abord, puis j'ai ajouté une nouvelle ligne à mon la télé. Je pense que le nombre d'objets dans ma source ou le contexte des données et le nombre de lignes à mon avis de la table devrait être 1.

Cependant, je suis une exception en cas de TabView: numberOfRowsInSection:

Mise à jour invalide: nombre de lignes incorrect dans la section 0. Le nombre de lignes contenues dans une section existante après la mise à jour (0) doit être égal au nombre de lignes contenues dans cette section avant la mise à jour (0), plus ou moins des lignes insérées ou supprimées de cette section (1 insérée, 0 supprimée).

L'exception a été soulevée juste après l'événement délégué:

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section { 
    // fetchedResultsController is class member var NSFetchedResultsController 
    id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] 
    objectAtIndex: section]; 
    NSInteger rows = [sectionInfo numberOfObjects]; 
    return rows; 
} 

En mode débogage, je trouve que les lignes était encore 0 et l'événement invoqué après la même de toggleEditing. Il semble que sectionInfo obtenu à partir de fetchedResultsController n'incluait pas le nouvel objet entité inséré. Vous ne savez pas si je manque quelque chose ou des étapes? Je ne suis pas sûr comment cela fonctionne: pour obtenir le fetcedResultsController notifié ou refléter le changement quand une nouvelle entité est insérée dans le contexte d'objet géré actuel?

Répondre

0

Je pense avoir trouvé une solution. En fait, je n'ai pas besoin de créer d'entité dans l'événement toggleEditing. Ensuite, l'objet entité doit être créé lorsqu'un événement d'insertion est validé. Voici la mise à jour de mes codes en cas toggleEditing:

- (void) toggleEditing { 
    UITableView *tv = (UITableView *)self.view; 
    if (isEdit) // class level flag for editing 
    { 
    insertRows = 1; // NSInteger value defined in the class or header 
    NSArray *insertIndexPaths = [NSArray arrayWithObjects: 
    [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here. 
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView setEditing:YES animated:YES]; // enable editing mode 
    } 
    else { insertRows = 0; ...} 
} 

En cas, une ligne est dynamiquement insérée dans l'affichage du tableau en cours. Depuis une nouvelle ligne est ajoutée, dans le délégué à la suite, je dois vous assurer que les lignes retournées dans la section reflète l'incitation:

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section { 
    // fetchedResultsController is class member var NSFetchedResultsController 
    id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] 
    objectAtIndex: section]; 
    NSInteger rows = [sectionInfo numberOfObjects]; 
    return rows + insertRows; 
} 

Puis, dans le délégué tableView: numberOfRowsInSection :, ajouter accessoire à la ligne insérée pour le marquer comme Add. La leçon que j'ai tirée de cette expérience est que lorsqu'une ligne est ajoutée dynamiquement à la vue tabulaire, il n'est pas nécessaire de créer un objet entité dans le contexte d'objet géré. L'objet est créé uniquement sur l'événement pour valider le style d'édition (ajouter). Une autre chose importante à retenir est que je dois suivre les lignes dans la section en synchronisation avec les lignes insérées dynamiquement ou supprimées, comme décrit ci-dessus. Par ailleurs, la raison pour laquelle j'ai essayé d'ajouter une ligne à ma vue de table sous la forme d'une interface utilisateur pour ajouter une nouvelle entité ou des données est basée sur l'application Contact de l'iPhone. Je comprends que la façon la plus courante d'ajouter une nouvelle entité est d'afficher le bouton Ajouter sur la barre de navigation, mais l'application Contact fournit une autre méthode pour le faire. Si vous sélectionnez une personne et que vous appuyez sur le bouton d'édition dans la barre de navigation, plusieurs lignes Ajouter sont affichées dans la vue Tableau de manière dynamique. Je ne suis pas sûr si ma solution est la bonne façon d'atteindre cet objectif. S'il vous plaît corrigez-moi et je voudrais accepter de bonnes réponses!

Questions connexes