2 Stimmen

Kerndaten 1-to-many-Beziehung: Auflistung aller verwandten Objekte als Abschnittsüberschrift in UITableView

Ich habe mit Core Data auf dem iPhone mit folgenden Problemen zu kämpfen: Ich habe eine 1-to-many-Beziehung in Core Data. Nehmen wir an, die Entitäten heißen Rezept und Kategorie. Eine Kategorie kann viele Rezepte haben. Ich habe es geschafft, alle Rezepte in einer UITableView mit Abschnittsüberschriften, die nach der Kategorie benannt sind, aufgelistet zu bekommen. Was ich erreichen möchte, ist, alle Kategorien als Abschnittsüberschrift aufzulisten, auch die, die kein Rezept haben:

category1   <--- this one should be displayed too
category2
     recipe_x
     recipe_y
category3
     recipe_z

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
 [fetchRequest setEntity:entity];
 [fetchRequest setFetchBatchSize:10];

 NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.categoryName" ascending:YES];
 NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"recipeName" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];

 [fetchRequest setSortDescriptors:sortDescriptors];
 NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.categoryName" cacheName:@"Recipes"];

Wie lässt sich dies am elegantesten mit Kerndaten erreichen?

3voto

Marcus S. Zarra Punkte 46405

Abschnitte sollten eigentlich nicht angezeigt werden, wenn sie keine Zeilen enthalten. Das ist die Art und Weise, wie die UITableView konzipiert ist. Wenn Sie wirklich erzwingen wollten, müssten Sie eine Logik in den Aufruf der Datenquelle -numberOfRowsForSection: um den Anschein zu erwecken, dass es immer eine Zeile gibt, und dann können Sie mit der -heightForRowAtIndexPath: um zu versuchen, die Zeile zu verbergen.

Allerdings ist es ein schrecklich Idee. Lassen Sie die Abschnitte sich selbst verstecken, wie es ihre Aufgabe ist.

0voto

Brian King Punkte 2824

Mit dem Code sectionNameKeyPath können Sie das nicht sauber machen. Ich würde die Abfrage der Kategorien in der Abrufanforderung ändern und sagen, dass sie Untertitel enthalten soll:

[fetchRequest setIncludesSubentities:YES];

Auf diese Weise wird die Abfrage effizient sein und nicht überall Fehler verursachen. Von dort fleshing aus Ihrem Delegaten sollte ziemlich einfach sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X