web-dev-qa-db-fra.com

NSInternalInconsistencyException ', motif:' tentative d'insertion d'une ligne dans la section 0, mais il n'y a que des lignes dans la section après la mise à jour '

J'utilise UITableViewController et j'obtiens cette erreur lors de la mise à jour de tableView. Ci-dessous mon code: 

Cela se produit lorsque je fais un événement de clic:

[timeZoneNames insertObject:@"HELLO" atIndex:0];  
[self.tableView beginUpdates];   
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];

J'ai essayé de chercher de la documentation Apple, mais cela n'a pas aidé.

Merci, Aby

40
insomiac

J'ai déjà rencontré ce problème auparavant. Cela signifie que lorsque -insertRowsAtIndexPaths:withRowAnimation: a été appelé, -tableView:numberOfRowsInSection: a renvoyé 0. Vous devez insérer le modèle avant d'appeler -insertRowsAtIndexPaths:withRowAnimation: (voir: -beginUpdates )


Mettre à jour

Je me demande quelle est la valeur de retour de -tableView:numberOfRowsInSection:? De plus, vous n'avez pas besoin de -beginUpdates/-endUpdates si vous ne disposez que d'une mise à jour.

[timeZoneNames insertObject:@"HELLO" atIndex:0];
// Let's see what the tableView claims is the the number of rows.
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]);
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];
28
Jeffery Thomas

J'ai rencontré cette erreur lorsque j'ai oublié de configurer correctement la sortie de la source de données.

Si vous voyez cette erreur, vérifiez que vous avez explicitement défini votre délégué et la source de données TableView: 

  • allez dans le constructeur de votre interface et regardez la vue avec la vue "Table"

  • cmd + faites un clic droit, faites glisser (vous devriez voir une ligne bleue) de l’icône 'Table View' à l’icône du titre du fichier; elle est entourée d’une icône jaune dans xcode 6.

  • relâchez votre souris, vous devriez voir les options de délégué et de source de données.

  • sélectionnez 'source de données' 

votre table devrait maintenant être correctement câblée.

29
NiallJG

J'ai essayé d'imprimer combien de lignes et de sections se trouvaient réellement dans la table dans la mise à jour, ce qui m'a amené à penser, combien de sections retournais-je dans la méthode de source de données de la vue table ... et c'était le coupable:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 0;
}

Assurez-vous de retourner 1 et non 0.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

Au moins, cela a résolu le problème pour moi ...

METTRE À JOUR:

Je rencontre à nouveau le même problème après un certain temps. J'avais un peu modifié l'application. Ma première vue est une tableView et lorsque vous cliquez sur le bouton plus en haut à droite, vous obtenez une autre table dans laquelle vous pouvez saisir des informations. Lorsque vous cliquez sur Terminé, les informations sont ajoutées au modèle Core Data avec ce code:

- (IBAction)doneButtonPressed:(UIBarButtonItem *)sender
{

MoneyBadgeAppDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context =
[appDelegate managedObjectContext];
NSManagedObject *newMoment;
newMoment = [NSEntityDescription
             insertNewObjectForEntityForName:@"SpendingMoment"
             inManagedObjectContext:context];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *modifiedDate = [dateFormat dateFromString: self.dateTextField.text];

[newMoment setValue: modifiedDate forKey:@"date"];
[newMoment setValue: descTextField.text forKey:@"desc"];

[appDelegate.eventsArray insertObject:newMoment atIndex:0];

NSError *error;
[context save:&error];

[self dismissViewControllerAnimated:YES completion:nil];

}

Et j’ai confirmé qu’il était correctement intégré au modèle Core Data en imprimant sur la console les éléments suivants dans ma méthode viewDidAppear lors du retour au premier écran.

-(void)viewDidAppear:(BOOL)animated{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SpendingMoment"  
inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSError *error;
NSArray *items = [self.managedObjectContext
                  executeFetchRequest:fetchRequest error:&error];

for (SpendingMoment *moment in items) {
    NSLog(@"Date: %@, Desc: %@", [moment date], [moment desc]);
}

[self addEvent];

Et puis ma méthode addEvent fait ceci:

- (void)addEvent {

[self.tableScreen beginUpdates];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableScreen insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                      withRowAnimation:UITableViewRowAnimationFade];


[self.tableScreen reloadData];
[self.tableScreen endUpdates];

@try{
    [self.tableScreen scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
@catch(NSException *exception){
}

}

Avez-vous une idée du problème, cette fois-ci ??? Merci!

4
Angie

Cochez cette "tentative d'insertion de la ligne 0 dans la section 0, mais il n'y a que 0 lignes dans la section 0 après la mise à jour".

Cela signifie que lorsque vous insérez un objet dans la rangée 0, la section 0, il n'y a pas de sections . Essayez d'insérer une section avant d'insérer la ligne.

 [timeZoneNames insertObject:@"HELLO" atIndex:0];
 NSLog(@"sections: %lu ",[self.downlaodTableView numberOfSections];
 // insert section 
 [self.tableView insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)] withRowAnimation:UITableViewRowAnimationNone];
 NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView  numberOfRowsInSection:0]);
 NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
 [self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];
0
ChokWah