2009-11-04 4 views
7

Angenommen, ich habe zur Veranschaulichung eine iTunes-Klon-App in Cocoa geschrieben, die von CoreData unterstützt wurde. Zur Vereinfachung, nehmen wir an, es gibt zwei "Abschnitte", "Bibliothek" mit Dingen wie Musik, Filme, Radio, etc. Und ein zweiter Abschnitt namens "Playlisten", die benutzergenerierte Wiedergabelisten enthält (nur dumme Listen, keine intelligenten Wiedergabelisten) .Wie würde eine Sourcen-Liste im iTunes-Stil mit Bindings + CoreData in Cocoa implementiert?

So würde die SourceList selbst typischerweise mit NSOutlineView implementiert werden, das ist in der Regel unkompliziert.

Der Bibliotheksbereich der Quellenliste enthält nicht wirklich alles, was vom Benutzer generiert wird, sondern nur "Funktionen" der App (im Wesentlichen), wo der Abschnitt "Playlisten" nur benutzerdefinierte Listen enthält, die vom Benutzer erstellt wurden. Wie würde man das mit Bindings und CoreData machen? Ist es möglich, den Bereich "Playlists" nur an die Daten des Nutzers zu binden und die Bibliotheksfunktionen benutzerdefiniert anzuzeigen?

Ich bin immer noch nass mit Bindings und AppKit im Allgemeinen, also bitte bitte mit mir. Ich schätze die Hilfe. Ich füge hinzu, ich ziele auf 10.6 und höher.

Antwort

6

Ich hatte nicht viel Erfahrung mit Kerndaten, aber ich habe die Bindungen von Cocoa ausgiebig benutzt. Nach meiner Erfahrung funktioniert so etwas am besten mit einem Zwischenprodukt NSArray von Objekten, das "manuell" eingestellt ist.

Als Beispiel stelle ich mir vor, Sie hätten eine benutzerdefinierte NSArray von Wiedergabelisten, die vom Benutzer erstellt wurden, und Sie hätten auch eine separate NSArray, die Ihre Standardbibliothekselemente enthält. Mit diesem Setup würde ich eine Eigenschaft in einem Ihrer Controller namens combinedArray erstellen, die die Eigenschaft sein würde, die an Ihre NSOutlineView gebunden wird. Ich würde dann Ihr benutzergeneriertes Wiedergabelisten-Array an den Controller binden und Code im Controller automatisch aktualisieren lassen, wenn das Playlist-Array geändert wird.

Hier ist eine schnelle Mock-up:

TheController.h

@interface TheController : NSObject 
{ 
    NSArray * combinedArray; 
    NSArray * userPlaylists; 
} 
@property (retain) NSArray * combinedArray; 
@property (copy) NSArray * userPlaylists; 
@end 

TheController.m

@implementation TheController 

@synthesize combinedArray; 
@synthesize userPlaylists; 
- (void)setUserPlaylists:(NSArray *)newLists 
{ 
    // standard property setting code: 
    if (newLists != userPlaylists) 
    { 
     [userPlaylists release]; 
     userPlaylists = [newLists copy]; 
    } 

    // modify the combined array: 
    NSMutableArray * allItems = [NSMutableArray arrayWithCapacity:0]; 
    [allItems addObjectsFromArray:standardLibrary]; 
    [allItems addObjectsFromArray:userPlaylists]; 
    [self setCombinedArray:allItems]; 
} 

@end 
+0

Das ist etwas, was ich dachte, dass getan werden müsste. Also wäre 'setUserPlaylists' eine von Bindings aufgerufene Methode? Ich bin unglaublich neblig, wenn es darum geht, wie Bindungen funktionieren (ich kenne ihre Beziehung zu KVC, aber wie sie tatsächlich mit Array/Tree Controllern konfiguriert sind, verwirrt mich immer noch). – jbrennan

+1

Ja.Cocoa kümmert sich um die verbindliche Magie hinter den Kulissen. Alles, was Sie tun müssen, ist eine Eigenschaft zu definieren, die KVO/KVC erfüllt. Jede Eigenschaft, die Sie @synthesize verwenden, wird diese Anforderung erfüllen, und jedes Mal, wenn Sie [self setSomePropertyName: someValue] verwenden, werden die entsprechenden KVC-Nachrichten gesendet. Abfangen des Property Setter (wie ich oben zeige) ist völlig legal. Ich bin mir nicht sicher, was Ihre Datenquelle für die Benutzer-Playlists ist (etwas von CoreData, vermute ich), aber wenn Sie es an Ihren Controller binden, erhält der Controller eine "setUserPlaylists:" Nachricht, wenn diese Liste geändert wird. –

1

Da die Quellenliste in diesem Fall wirklich ein "Bereich" und keine flache Liste von nichts als Instanzen einer "LibraryItem" -Entität ist, denke ich, dass es einfacher ist, diese "altmodische" Art zu implementieren (dh Tabelle Datenquellenprotokoll).

Damit haben Sie eine präzise Kontrolle über Gruppierung, wie/wann "statische" Elemente (wie "Bibliothek" und "Musik" und "Filme", ​​"Playlisten") mit Elementen aus Ihrem Geschäft (wie die einzelne Playlist) mischen Elemente im Bereich "Playlisten".

Es ist auch ein wenig einfacher mit Drag & Drop umzugehen, was meiner Meinung nach der Schlüssel ist, wenn verhindert wird, dass ein Playlist-Element in Ihrer "Movies" -Gruppe abgelegt wird.

Verwandte Themen