Mam raczej wanilię UITableView
zarządzaną przez NSFetchedResultsController
, aby wyświetlić wszystkie wystąpienia danej encji Core Data.tableView: cellForRowAtIndexPath wywoływana z zerową ścieżką IndexPath po usunięciu elementu
Gdy użytkownik kasuje wpisu w widoku tabeli, przesuwając nad nim, tableView:cellForRowAtIndexPath:
ostatecznie zostanie wywołany na moim UITableViewController
z nil
indexPath
. Ponieważ nie spodziewałem się, że zostanie wywołany z nil
indexPath
, aplikacja ulega awarii.
mogę obejść katastrofie przez sprawdzenie tej wartości nil
a następnie powrocie pustą komórkę. To wydaje się działać, ale nadal martwię się, że mogłem sobie poradzić z czymś złym. Jakieś pomysły? Czy ktokolwiek widział tableView:cellForRowAtIndexPath:
z numerem nil
indexPath
?
Zauważ, że to się dzieje tylko wtedy, gdy użytkownik usuwa z widoku tabeli, przesuwając na komórkę. Podczas usuwania elementu przy użyciu trybu edycji widoku tabeli, tak się nie dzieje. Czym różni się ten sposób usuwania komórki?
Czy to naprawdę OK, aby uzyskać nil
indexPath
w metodzie delegata widoku tabeli?
Mój kod widok kontroler jest naprawdę norma. Oto delecja:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.moc deleteObject:managedObject];
NSError *error = NULL;
Boolean success = [self.moc save:&error];
if (!success) { <snip> }
// actual row deletion from table view will be handle from Fetched Result Controller delegate
// [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else { <snip> }
}
Doprowadzi to do sposobu NSFetchedResultsController
delegata miano:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeInsert: <snip> break;
case NSFetchedResultsChangeUpdate: <snip> break;
case NSFetchedResultsChangeMove: <snip> break;
}
}
I oczywiście, metody źródła danych są obsługiwane przez NSFetchedResultsController
, np:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
Dziękujemy.
Czy zweryfikować wszystkie te nazywa się w przewidywanym porządku? – Mundi
Spróbuj zadzwonić 'reloadData' na widoku tabeli w' Tableview: commitEditingStyle: forRowAtIndexPath' natychmiast * po * zapisywania zmian w kontekście zarządzanego obiektu. Miałem podobny problem z tym i ponowne załadowanie widoku tabeli naprawiło to. – Greg