2015-04-23 11 views
5

Sto lavorando a un progetto utilizzando Microsoft Azure services. In che durante l'eliminazione di fila sto ottenendo questo errore:Aggiornamento non valido: numero di righe non valido nella sezione

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). 

Codice per il carico tavola e cancellare riga è come:

- (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; 
} 

Informi dove sto andando male. Grazie in anticipo !!!!

+0

è necessario rimuovere l'oggetto da self.fetchedResultsController1 prima di eliminareRowsAtIndexPaths. – iBhavin

+0

fetchedResultsController in metodo delegato lo sta già facendo. L'ho già controllato – Arti

+0

iBhavin lo ha provato, ma lo stesso messaggio di errore è in arrivo – Arti

risposta

16

In - (void)swipeableTableViewCell: didTriggerRightUtilityButtonWithIndex:

è necessario rimuovere sia

[self.medicationsTableView reloadData]; 

o

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

Perché in prima linea quando reloadData ottenere chiamato è ricaricare il Tableview con nuova origine dati e di nuovo chiamando deleteRowsAtIndexPaths provato per eliminare una riga già rimossa chiamando in precedenza reloadData.

11

La cosa importante è che è necessario utilizzare

[self.medicationsTableView reloadData]; 

o

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

La ragione di essere, quando la tableview's reload data si chiama la riga che viene rimosso dalla fonte di dati è cancellata e dopo che quando si chiama la riga di eliminazione api per lo stesso index path (dove la riga è già eliminata causa il problema)

Anche jus t prima di eliminare la riga dalla tabella eliminare l'oggetto dalla sorgente di dati (self.fetchedResultsController1) e chiamare

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

e dopo la cancellazione di animazione sopra della fila è completata quanto si può chiamare (ma non è obbligatorio)

[self.medicationsTableView reloadData]; 
+3

@TapasPal non importa. E c'è una certa differenza tra entrambe le risposte. controlla prima –

+3

@TapasPal, potrebbe accadere che una persona durante la creazione di una risposta non veda le risposte che erano state pubblicate mentre lui/lei stava creando una risposta e, soprattutto, perché dovrebbe preoccuparsi delle altre persone che postano se le loro risposte sono in sintonia con il mio o così? –

+0

In questo scenario non è necessario chiamare 'reloadData' se usiamo' deleteRowsAtIndexPaths' –