2015-06-19 5 views
5

Nie widziałem tego błędu wcześniej, a ja przeprowadziłem wyszukiwanie, dlaczego tak się dzieje ale nie mógł znaleźć żadnych informacji na ten temat:Błąd wewnętrzny interfejsu UITableView: nie można wygenerować nowej mapy przekroju ze starą liczbą sekcji: i nowa liczba sekcji: z 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)

Czy ktoś wie, co może się tutaj wydarzyć? Nie jestem pewien co do części "błąd wewnętrzny" - czy ten błąd wskazuje na problem z moim kodem lub błąd w UITableView?

+0

Domyślam się, że jego problem w Twojej NSFetchedResultsController delegate method controllerDidChangeContent ... w tej metodzie źródła danych nie oczekuje się, że UITableView chce. – Tirth

+0

Mam ten sam błąd, ale nie używam NSFetchedResultsController, tylko 'tableView.deleteRowsAtIndexPaths ([indexPath] ...)' i odwróciłem **, nigdy nie mówiąc sekcji = 0 ** w 'override func numberOfSectionsInTableView (tableView: UITableView) ', zawsze zachowaj przynajmniej 1, może pusty – grominet

+1

#grominet, nie rób tego, zamiast tego usuń sekcję, a nie wiersz, jeśli jest to ostatni wiersz sekcji – Stephan

Odpowiedz

2

Stephan wspomniał już o tym w komentarzu do pierwotnego pytania, ale pomyślałem, że warto było udostępnić jakiś kod. Ta odpowiedź została faktycznie pochodzą z komentarzem wykonane przez użytkownika GERUB w wątku na forum jabłko dev znaleźć tutaj: 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) 
} 

Ja testowałem to wnętrze implementacji metody NSFetchedResultsControllerDelegate i działa idealnie.

1

Użyłeś tego NSFetchedResultsController w wielu UITableView. Jeśli tak, to jest przyczyną. Użyj jednego NSFetchedResultsController dla jednego UITableView. Nie przełączaj tylko zapytań podczas przełączania widoków.

0

Podczas korzystania z CoreData z NSFetchedResultsController nie musisz się martwić sprawdzaniem, czy jest to ostatni element w usuwanej sekcji.

Możesz po prostu użyć innej metody NSFetchedResultsControllerDelegate: controller(: NSFetchedResultsController<NSFetchRequestResult>, didChange: NSFetchedResultsSectionInfo, atSectionIndex: Int, for: NSFetchedResultsChangeType).

Ta metoda delegowania poinformuje Cię automatycznie, kiedy sekcja zostanie dodana lub usunięta, a następnie możesz podjąć odpowiednie działania, co pozwoli ci uzyskać prostszy kod.

Powiązane problemy