无效的更新:节中的行数无效

我正在使用Microsoft Azure services的项目。 在删除一行时,我得到这个错误:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). 

表加载和删除行的代码如下:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //medicine list if (section == 0) { NSArray *sectionInfo = [self.fetchedResultsController1 fetchedObjects]; return [sectionInfo count]; } //allergy list else if (section == 1) { NSArray *sectionInfo = [self.fetchedResultsController2 fetchedObjects]; return [sectionInfo count]; } //notes list else if (section == 2){ NSArray *sectionInfo = [self.fetchedResultsController3 fetchedObjects]; return [sectionInfo count]; } else return 0; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"mcell"; MedicationTableViewCell *cell = (MedicationTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; // Add utility buttons NSMutableArray *rightUtilityButtons = [NSMutableArray new]; [rightUtilityButtons sw_addUtilityButtonWithColor: [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] title:@"Delete"]; switch (indexPath.section) { case 0: { NSManagedObject *item = [self.fetchedResultsController1 objectAtIndexPath:indexPath]; cell.textLabel.text = [item valueForKey:@"name"]; break; } case 1: { NSManagedObject *item = [self.fetchedResultsController2 objectAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:0]]; cell.textLabel.text = [item valueForKey:@"name"]; break; } case 2: { NSManagedObject *item = [self.fetchedResultsController3 objectAtIndexPath: [NSIndexPath indexPathForRow:indexPath.row inSection:0]]; cell.textLabel.text = [item valueForKey:@"title"]; break; } default: break; } cell.rightUtilityButtons = rightUtilityButtons; cell.delegate = self; return cell; } - (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index { // Delete button is pressed NSIndexPath *cellIndexPath = [self.medicationsTableView indexPathForCell:cell]; //fetchingg data from local store first NSManagedObject *item = [self.fetchedResultsController1 objectAtIndexPath:[NSIndexPath indexPathForRow:cellIndexPath.row inSection:0]]; NSMutableArray *keys = [[NSMutableArray alloc] initWithObjects:@"id", @"name", @"userId", nil]; NSMutableArray *values = [[NSMutableArray alloc] initWithObjects: [item valueForKey:@"id"], [item valueForKey:@"name"], [item valueForKey:@"userId"], nil]; //creating dictionary of data NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys]; //calling delete fucntion [self.authService deleteItem:self.syncTable withDict:dict completion:^{ //removing row from table view [self.medicationsTableView reloadData]; [self.medicationsTableView deleteRowsAtIndexPaths:@[cellIndexPath] withRowAnimation:UITableViewRowAnimationRight]; }]; break; } 

请告诉我哪里错了。 感谢advcance !!!!

- (void)swipeableTableViewCell: didTriggerRightUtilityButtonWithIndex:

你需要删除

 [self.medicationsTableView reloadData]; 

要么

 [self.medicationsTableView deleteRowsAtIndexPaths:@[cellIndexPath] withRowAnimation:UITableViewRowAnimationRight]; 

因为在reloadData被调用的第一行,它重新加载tableview与新的数据源,并再次调用deleteRowsAtIndexPaths试图删除通过调用reloadData先前已经删除的行。

重要的是你需要使用

 [self.medicationsTableView reloadData]; 

要么

 [self.medicationsTableView deleteRowsAtIndexPaths:@[cellIndexPath] withRowAnimation:UITableViewRowAnimationRight]; 

原因是,当调用tableview's reload data时,从数据源中删除的行被删除,之后当删除行api被调用到相同的index path (这个行已经被删除导致问题)

也就在从表中删除行之前从数据源( self.fetchedResultsController1 )中删除对象并调用

 [self.medicationsTableView deleteRowsAtIndexPaths:@[cellIndexPath] withRowAnimation:UITableViewRowAnimationRight]; 

和上面的行删除animation完成后,你可以调用(但不是必需的)

 [self.medicationsTableView reloadData];