2009-06-16 30 views
13

Este problema me ha mantenido ocupado durante las últimas horas. Tengo dos secciones con una fila en cada sección. Cuando elimino la fila en una de las secciones, arroja una excepción diciendo que esta es una actualización no válida (el número de filas/secciones antes y después de la actualización no son las mismas). Esto es comprensible ya que elimino la última fila de una sección y, por lo tanto, elimino la sección. La pregunta es cómo evitar la excepción.¿Cómo borrar la última fila de una sección?

Todo está bien con mi fuente de datos. Lo revisé y volví a verificar (créanme).

Así que, como dice el título del hilo, ¿cómo se elimina la última fila de una sección sin obtener una excepción?

Gracias,

Bart

+0

“título del hilo” Este es un sitio de preguntas y respuestas, no es un foro Te refieres al título de la pregunta. –

Respuesta

26

Cuando se elimina una fila, y esta fila es el último de su sección, es necesario también eliminar la sección. Básicamente, necesita realizar un seguimiento de los indexPaths que desea eliminar, que están asociados a las filas, y los índices relacionados con las secciones que deben eliminarse porque ya no contienen filas. Usted puede hacerlo de la siguiente manera:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Cada vez que se elimina un objeto a partir de la matriz de modelo relacionado a una sección específica de la tableView, comprobar si el recuento de matriz es cero, en cuyo caso se añade un índice que representa la sección a los índices:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

determinar todos los indexPaths relacionados con las filas que desea borrar, y luego actualizar el tableView de la siguiente manera:

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Esto funcionó para mí y o a gente le sugerí el enfoque.

+0

Esta opción funciona aunque cuando eliminas la última sección se lanza otra excepción (pero encontraré una manera de resolver esto). Encuentro difícil de creer que esta sea la única forma. Parece tan poco elegante/poco elegante. No solo funciona ;-). Gracias por su aporte, sin embargo. –

+2

Para agregar a esto, cuando elimino la última fila de una sección, solo llamo deletesections: withRowAnimation :. No llamo deleteRowsAtIndexPaths: withRowAnimation :. La animación tiene el mismo aspecto y no arroja ninguna excepción. – Alex

+0

¿Cómo lidiar con la eliminación de la última fila de la última sección? –

1

Tal vez esto puede funcionar para usted:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [self.keys objectAtIndex:section]; 
    NSMutableArray *rowsInSection = [self.dict objectForKey:key]; 
    [rowsInSection removeObjectAtIndex:row]; 

    NSUInteger rowsInSectionCount = [rowsInSection count]; 

    if (rowsInSectionCount > 0) { 
     // If we still have rows in this section just delete the row 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    else { 
     // There are no more rows in this section 
     [self.dict removeObjectForKey:key]; 
     [self.keys removeObjectAtIndex:section]; 

     NSUInteger sectionCount = [self.keys count]; 

     if (sectionCount > 0) { 
      // If we still have 1 or more sections left just delete this section 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else { 
      // If there are no more rows and sections left just delete the last row 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView reloadData]; 
     } 
    } 
} 

Hope esto es lo que estaba buscando.

1

Ésta debe hacer el truco:

// Either delete some rows within a section (leaving at least one) or the entire section. 
    if ([indexPath section] < 0) { 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if ([indexPath section] == 0) { 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
1

para SWIFT 2, después de la eliminación de los datos en su modelo:

tableView.beginUpdates()      

    let indexSet = NSMutableIndexSet() 
    indexSet.addIndex(indexPath.section) 
    tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade) 

    tableView.endUpdates() 
Cuestiones relacionadas