2015-06-19 8 views
5

Non ho visto questo errore prima e ho fatto una ricerca sul motivo per cui potrebbe accadere ma non è stato possibile trovare alcuna informazione su di esso:Errore interno UITableView: impossibile generare una nuova mappa di sezione con il conteggio delle vecchie sezioni: e nuovo conteggio delle sezioni: con userInfo (null)

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. UITableView internal bug: unable to generate a new section map with old section count: 1 and new section count: 0 with userInfo (null)

Qualcuno sa cosa potrebbe accadere qui? Non sono sicuro della parte "bug interno": questo errore indica un problema con il mio codice o un bug in UITableView?

+0

Immagino che il suo problema nel NSFetchedResultsController metodo delegato controllerDidChangeContent ... in questo metodo non ci si aspetta l'origine dati UITableView. – Tirth

+0

Ho lo stesso errore, ma non uso NSFetchedResultsController, solo 'tableView.deleteRowsAtIndexPaths ([indexPath] ...)' e ho girato intorno a ** mai dicendo sezione = 0 ** in 'sostituisci func numOfSectionsInTableView (tableView: UITableView) ', mantieni sempre almeno 1, forse vuoto – grominet

+1

#grominet, non farlo, cancella invece la tua sezione e non la tua riga se è l'ultima riga della sezione – Stephan

risposta

2

Stephan ha già menzionato questo in un commento sulla domanda originale ma ho pensato che valesse la pena condividere un po 'di codice. Questa risposta è stata in realtà provenienti da un commento fatto dall'utente GERUB su un thread sul forum di Apple dev trovate qui: https://forums.developer.apple.com/thread/9964

if tableView.numberOfRowsInSection(indexPath.section) == 1{ 
    tableView.deleteSections(NSIndexSet(index: indexPath.section), withRowAnimation: .Automatic) 
}else{ 
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
} 

Ho testato questo all'interno del metodo NSFetchedResultsControllerDelegate implementazioni e funziona perfettamente.

1

Si è utilizzato questo NSFetchedResultsController in più UITableView. Se è così, questa è la causa. Utilizzare un NSFetchedResultsController per un UITableView. Non passare semplicemente le query quando si cambiano le visualizzazioni.

0

Quando si utilizza CoreData con NSFetchedResultsController, non è necessario eseguire il controllo per verificare se si tratta dell'ultimo elemento in una sezione che si sta eliminando.

È possibile utilizzare semplicemente un altro dei metodi NSFetchedResultsControllerDelegate: controller(: NSFetchedResultsController<NSFetchRequestResult>, didChange: NSFetchedResultsSectionInfo, atSectionIndex: Int, for: NSFetchedResultsChangeType).

Questo metodo delegato ti informa specificatamente quando una sezione viene aggiunta o rimossa e puoi quindi agire di conseguenza, consentendo di avere un codice più semplice.