Selektiertes Objekt in einer TableView via ArrayController auslesen

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

  • Selektiertes Objekt in einer TableView via ArrayController auslesen

    Hallo Leute!

    Ich habe ein kleines Demoprogram gebaut. Im Prinzip eine Tableview mit Detailview der selektierten Reihe.
    Des weiteren einen Button, welcher wenn er gedrückt wird, die aktuell selektierte Reihe zurückliefert und diese zZ. im NSLog ausgibt
    (später soll der String als HexValues interpretiert werden und dann an einen Server geschickt werden)


    Der Button triggert in SendController die -(IBAction)buttonPressed:(id)sender;
    welche über das Outlet IBOutlet id getSelectedData beim ArrayController nach den selektierten Objekten nachfragt.


    Im Prinzip funktioniert das gut, aber ich bin mir nicht sicher ob dies nicht auch eleganter zu lösen wäre.


    Eventuell könnt Ihr mir da ein paar Tipps geben...

    lg. fritz
  • Im Grunde geht das alles in die richtige Richtung. Eine NSArrayController subclass braucht Du in den meisten Fällen nicht, insbesondere nicht um den selection-proxy zu entfernen (in diesem Falle einfach valueForKey:@"selection.self" an den AC). Aber selbst das ist in Deinem Falle unnötig, da Du die selektierten Daten eh nur per KVC weiterverarbeitest. Aber wenn Du mit Bindings arbeitest, ist ja das Ziel, den ganzen UI-gluecode zu vermeiden. Genau dann sind die proxies von den NSController-subclassen sehr nützlich. Die Auswertung der Selektion erfolgt eh über KVO/Bindings. Generell lässt sich Dein Vorhaben beinahe ohne boilerplate-code realisieren, denn ein NSButton hat ein target und argument-Binding. Das Argument bindest Du an die selection des AC und das target an den zuständigen Controller (womöglich sogar an das selektierte Objekt selbst, wieder über die selection-proxy).

    P.S.: getter beginnen in Cocoa direkt mit dem property-Name für den getter (ohne den prefix get), setPropertyName für den setter.
  • Markus Müller schrieb:

    Im Grunde geht das alles in die richtige Richtung. Eine NSArrayController subclass braucht Du in den meisten Fällen nicht, insbesondere nicht um den selection-proxy zu entfernen (in diesem Falle einfach valueForKey:@"selection.self" an den AC). Aber selbst das ist in Deinem Falle unnötig, da Du die selektierten Daten eh nur per KVC weiterverarbeitest. Aber wenn Du mit Bindings arbeitest, ist ja das Ziel, den ganzen UI-gluecode zu vermeiden. Genau dann sind die proxies von den NSController-subclassen sehr nützlich. Die Auswertung der Selektion erfolgt eh über KVO/Bindings. Generell lässt sich Dein Vorhaben beinahe ohne boilerplate-code realisieren, denn ein NSButton hat ein target und argument-Binding. Das Argument bindest Du an die selection des AC und das target an den zuständigen Controller (womöglich sogar an das selektierte Objekt selbst, wieder über die selection-proxy).

    P.S.: getter beginnen in Cocoa direkt mit dem property-Name für den getter (ohne den prefix get), setPropertyName für den setter.

    Danke für die Hilfe!

    So ganz bring ich es noch nicht hin ...


    Der "Send Selection" -Button hängt jetzt nicht mehr an der Action, sondern es wird das Target Binding and die "buttonPressed:" Methode gebunden.
    (Projekt )

    Was für Controller Key, Model Key Path zu setzen ist weiß ich nicht.

    --> Was gehört hier gesetzt?

    Der nächste Schritt wäre das Argument Binding korrekt zu befüllen.
    Das Argument sollte die Werte der Selektion aus dem ArrayController liefern. Nur wie bringe ich diese in die "buttonPressed:" Methode, welche ja dann mit den selektierten
    Werten etwas machen soll (z.Z. NSLog)

    lg. fritz

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Fritz ()

  • Ok, Ich glaube ich habe jetzt eine brauchbare Lösung gefunden....

    Siehe Projekt

    Man bindet für den Button das Argument-Binding and den dataObjectArrayContoller / Controller Key = selection und Selector Name = buttonPressed:
    Das Target-Binding bindet man an den SendController, der ja die selektierten Daten erhalten und verarbeiten soll. Model Key Path = self / Selector Name = buttonPressed:

    Im Send Controller.m implementiert man:

    Quellcode

    1. -(void)buttonPressed:(id)selectedEntry;
    2. {
    3. if ([selectedEntry valueForKey:@"self"] == NSNoSelectionMarker)
    4. {
    5. NSLog(@"Nothing selected");
    6. return;
    7. }
    8. NSString *aStr = [selectedEntry valueForKey:@"commentString"];
    9. NSString *bStr = [selectedEntry valueForKey:@"hexdataString"];
    10. NSLog(@"Selected: %@, %@",aStr,bStr);
    11. }
    Alles anzeigen



    Falls jemand noch besser Lösungen hat, bitte posten ...

    lg. fritz