Ich habe alle diesbezüglichen Beiträge gelesen und habe immer noch einen Fehler:
'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), 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).'
Hier sind die Details:
in .h
Ich habe eine NSMutableArray
:
@property (strong,nonatomic) NSMutableArray *currentCart;
In .m
meinem numberOfRowsInSection
Aussehen so:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return ([currentCart count]);
}
So aktivieren Sie das Löschen und Entfernen des Objekts aus dem Array:
// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//when delete is tapped
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[currentCart removeObjectAtIndex:indexPath.row];
}
}
Ich dachte, wenn meine Anzahl von Abschnitten von der Anzahl des Arrays abhängt, das ich bearbeite, würde dies die richtige Anzahl von Zeilen sicherstellen? Kann man das nicht tun, ohne die Tabelle neu laden zu müssen, wenn man eine Zeile löscht?
quelle
deleteRowsAtIndexPaths
rufen Sie einfach automatisch reload? und sieht dann eine Nichtübereinstimmung?Swift-Version -> Entfernen Sie das Objekt aus Ihrem Datenarray, bevor Sie es aufrufen
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { print("Deleted") currentCart.remove(at: indexPath.row) //Remove element from your array self.tableView.deleteRows(at: [indexPath], with: .automatic) } }
quelle
In meinem Fall war das Problem, dass
numberOfRowsInSection
nach dem Aufruf eine ähnliche Anzahl von Zeilen zurückgegeben wurdetableView.deleteRows(...)
.Da dies in meinem Fall das erforderliche Verhalten war, habe ich letztendlich angerufen,
tableView.reloadData()
anstatttableView.deleteRows(...)
in Fällen, in denennumberOfRowsInSection
nach dem Löschen einer Zeile dieselbe bleibt.quelle
Hier ist ein Code von oben, der mit dem tatsächlichen Aktionscode hinzugefügt wurde (Punkt 1 und 2).
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { _, _, completionHandler in // 1. remove object from your array scannedItems.remove(at: indexPath.row) // 2. reload the table, otherwise you get an index out of bounds crash self.tableView.reloadData() completionHandler(true) } deleteAction.backgroundColor = .systemOrange let configuration = UISwipeActionsConfiguration(actions: [deleteAction]) configuration.performsFirstActionWithFullSwipe = true return configuration }
quelle