NSArrayController subclassen ...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSArrayController subclassen ...

    Moin,

    ich bin noch frisch und habe eigentlich eine recht einfaches Vorhaben:
    Ich habe drei Klassen: Bereiche, Unterbereiche und Einträge:

    Quellcode

    1. @interface Bereich : NSObject <NSCoding>{
    2. NSMutableDictionary *werte;
    3. NSMutableArray *unterbereiche; } ...
    4. @interface Unterbereich : NSObject <NSCoding>{
    5. NSMutableDictionary *werte;
    6. NSMutableArray *eintraege; }...
    7. @interface Eintrag : NSObject <NSCoding>{
    8. NSMutableDictionary *werte;
    9. NSMutableDictionary *auslandsWerte; }...
    Alles anzeigen


    Am liebsten würde ich das ganze per OutlineView darstellen, aber das kriege ich beim besten Willen und aller Geduld nicht gebacken und habe mich daher mit TableViews arrangiert.

    Über verschiedene Tabellen und NSArrayController (direkt aus dem IB) habe ich auch alles so verbunden, dass ich mit Standard add: und remove: meine Daten verändern kann.

    Nun würde ich aber gerne abhängig vom jeweiligen Unterbereich unterschiedliche Einträge anlegen: Personen mit Vornamen, Nachnamen und Geburtstag oder Firmen, mit anderen Werten im Werte-Dictionary.

    Ich habe schon eine NSArrayController Subclass erstellt, schaffe es aber nicht sie zu verdrahten:

    Quellcode

    1. @interface EintragsArrayController : NSArrayController
    2. {
    3. IBOutlet Sektion *dieSektion;
    4. }
    5. -(IBAction)addEintrag:(id)sender;
    6. @end
    7. @implementation EintragsArrayController
    8. -(void)addEintrag:(id)sender{
    9. // Arrays und Dictionary erzeugen
    10. NSMutableArray *keys= [NSMutableArray arrayWithObjects:@"Name", @"Vorname", nil];
    11. NSMutableArray *values= [NSMutableArray arrayWithObjects:@"Walter", @"Peter",nil];
    12. NSDictionary *dasDictionary = [[NSDictionary alloc] initWithObjects: values forKeys: keys];
    13. Eintrag* derEintrag = [Eintrag initMitDictionary: dasDictionary];
    14. NSMutableArray* eintraege = [dieSektion mutableArrayValueForKey:@"eintraege"];
    15. [eintraege addObject:newPerson];
    16. @end
    Alles anzeigen


    Ich habe schon versucht über ein Outlet in der Klasse Zugriff auf die Sektion zu kriegen, schaffe es aber irgendwie nicht.

    Ich bin mir recht sicher, dass es eigentlch ganz einfach ist, aber irgendwie bin ich blockiert.

    Vielen Dank für jeglichen Kommentar und Frohe Ostern.
    dp
  • RE: NSArrayController subclassen ...

    Das mit dem OutlineView glaube ich dir, ist alles Andere als trivial.
    Zumindest nach meinem Empfinden. Aber es ist machbar. ;)

    Eine Subklasse brauchst du da nach meinem Dafürhalten aber nicht, nur isses gerade zu spät für mich um mir ein alternatives Muster zu spinnen. Deshalb kurz:

    Deinem Array-Controller mitteilen, dass er nicht mehr von der Klasse NSArrayController sondern EintragsArrayController ist. Sollte im Informationsfeld des ArrayControllers gehen.

    Nur hast du jetzt natürlich keinen Filter drin, was die Selektion angeht. ;)

    (Und wenn du mit Anderen zusammen entwickelst werden sie dir wahrscheinlich dieses DEnglisch um die Ohren hauen. ;))
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Du könntest für "Bereiche", "Unterbereiche" und "Eintrag" eine gemeinsame Superklasse definieren, nennen wir Sie "Baum". In "Baum" definierst Du die gemeinsamen Eigenschaften "Werte" und "Kinder". Die Klasse "Baum" teilst Du dem TreeController mit.
    "Bereiche", "Unterbereiche" und "Eintrag" sind Subklassen von "Baum".

    add: und addChild: des TreeControllers funktioniert nur, wenn Du immer die gleiche Klasse in Deinem Baum hast.

    Du kannst die Anlage von Kindern natürlich auch woanders hin verlagern. Nachdem das Datenmodell am ehesten "weiß", wer seine Kinder sind, kannst Du eine addChild:-Methode auch in Dein Datenmodell legen, z. B. in "Baum". In den Klassen "Bereiche", "Unterbereiche" und "Eintrag" brauchst Du dann nur eine Methode, die Dir die Klasse eines Kindes mitteilt. Also so

    Quellcode

    1. // in "Baum":
    2. - (void)addChild:(id)sender{
    3. Class childClass = [self classForChild];
    4. id aChild = [[[childClass alloc] init...]...;
    5. [self.Kinder addObject:aChild]; // das hier musst Du allerdings KVC-Konform machen
    6. }
    7. // in "Bereiche", "Unterbereiche" und "Eintrag". das Beispiel zu "Bereiche"
    8. -(Class)classForChild{
    9. return [Unterbereich class];
    10. }
    Alles anzeigen


    Die Anlage machst Du dann nicht direkt über den TreeController, sondern über einen eigenen Controller. In diesem Controller holst Du dir das aktuelle Baum-Objekt über die selection des TreeControllers und sendest diesem Objekt addChild:self.

    Alles ungetestet nur mal so auf die Schnelle hingeschrieben.

    No.
  • RE: NSArrayController subclassen ...

    In der Tat ist hier die Frage, was du mit einer Subklasse willst. Kommst du von C++?

    Um das Verhalten einer Instanz zu ändern, gibt es drei Wege:

    a) Parametrisierung, wenn vorgesehen
    b) Delegating, wenn vorgesehen
    c) Subclassing, wenn nichts vorgesehen.

    Subclassing ist also gewissermaßen der Notausgang, der wie Objcler ganz richtig sagt, nur für wenige Klassen so gedacht ist. In jedem Falle sollte c) erst nach Prüfung von a) und b) gewählt werden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Moin,

    erstmal vielen Dank für die Ideen, das mit der gemeinsamen Superklasse war mir nicht eingefallen, macht aber natürlich Sinn.

    Bin gerade dabei der Klasse eine weitere Variable zu geben, in dem dann die init-Werte für die Kinder drin sind - plane eine zentrales Dictionary, wo für alle Unterbereiche Werte definiert werden und die Klasse muss beim Einfügen eines Kindes dort nachschlagen ...

    Schade, dass das Wetter gerade jetzt so gut sein muss...

    Beste Grüße
    dp