Problem mit ComboBox und deren Binding

  • Problem mit ComboBox und deren Binding

    Hallo,

    ich hab folgendes Problem...
    Ich hab eine Klasse "Movie" und eine Klasse "Actor"
    Ein Movie kann mehrere Actors haben...

    Im IB habe ich 2 ArrayController (einer für die Klasse Movie und einer für die Klasse Actor) und das ContentArray von Actors habe ich an Movies.actors gebunden.

    Das funktioniert auch... Sprich wenn ich einen Film auswähle, ist in der ComboBox in der ich dann die Schauspieler auswählen kann auch das richtige drinnen, aber leider erst, wenn ich wieder auf den Button "V" klicke und einen anderen auswähle. Ich hoffe ihr versteht mich... also, wenn ich einen Film auswähle und dann einen dazugehörigen Schauspieler, sind in der ComboBox die richtigen drinnen, wenn ich dann aber einen anderen Film auswähle, updated die ComboBox nicht automatisch...

    Ach ja.. und kann ich so machen dass die ComboBox automatisch das erste Element anzeigt?


    ::EDIT...
    Und auch wenn ich in der ComboBox was auswähle, ändern sich die dazugehörigen Werte leider nicht mit. Ein Actor hat einen Namen und eine Rolle. Wenn ich in der ComboBox den Actor ändere, bleibt das Textfield das an "Actors.role" gebunden ist gleich :(

    Vielleicht habt ihr eine Ahnung was ich vergessen haben könnte...
    ::EDIT END...

    Hoffe ihr versteht mich :)

    Danke und Lg
  • Ist schon mal besser, ja...danke
    Also jetzt änder sich der Wert im PopUp-Menü schon mal mit :)
    Nur wenn ich was auswähle, änder sich noch nichts :(

    Also so schauts im IB aus:

    PopUp-Menü "as:" Textfield

    Wenn ich jetzt in dem PopUp was answähle, ändert sich im Textfield noch nichts mit...

    Habt ihr eine Ahnung was ich da vergessen haben könnte?
    Lg
  • Ich versuch mal zu beschreiben was ich gemacht habe:

    Ich hab im IB 2 ArrayController:
    - Movies (Mode: Class, Class Name: "Movie")
    - Actors (Mode: Class, Class Name: "Actor")

    Beim Actors-ArrayController habe ich "Controller Content" an Movies (Controller key: "selection" und Model Key Path: "actors") gebunden.

    "actors" ist im Movie ein

    Quellcode

    1. NSMutableArray *actors;
    und mittels Properties sichtbar.


    Das funktioniert sowiet, dass ich alle Actors in dem PopUp-Menü sehe, aber wenn ich da einen anderen Eintrag wähle, soll im Textfield, das daneben ist, die Rolle ("roll"), sich ändern. Die bleibnt aber unabhängig von dem was ich im PopUp auswähle, immer die Rolle des ersten in der PopUp Liste.

    Wenn ihr noch mehr Infos benötigt um mein Problem einzugrenzen... nur sagen :)
    Danke und Lg, BliBlaBlo
  • Sodala...

    Du bekommst über das PopUp-Menü für die Actors so keine "selection" des ArrayController aktualisiert, deshalb bleibt die "selection" des Actory-ArrayControllers immer gleich und "Himself" ändert sich nie auf "Herself".
    Das kannst Du so testen:
    Lege ein NSTableView in die Benutzeroberfläche und binde die 1. TableColumn gleich wie das PopUp an Actors.arrangedObjects.name. Wenn Du jetzt den selected Actor im TableView wechselst, paßt sich die Rolle korrekt an.

    Das liegt daran, daß Du im PopUp durch auswählen eines Actors nicht die selection des Actors-ArrayControllers beeinflußt.

    Ich hab's mal auf die Schnelle hingebogen, indem ich
    - in Movies ein property für "selectedActor" angelegt habe
    - das "selectedObject"-Binding des PopUps auf "Movies.selection.selectedActor" gesetzt habe (!)
    - das Role-Textfeld auf Movies.selection.selectedAuthor.name gesetzt habe

    Krumm ist das bestimmt, aber der Kern der Sache ist, daß die selection des Actors-ArrayControllers durch das PopUp nur verändert wird, wenn Du das selectedObject-Binding setzt.

    No.
  • Vielen vielen Dank für deine Mühe!!!
    Das selectedObjectBinding kann ich anders nicht ändern? Ist es richtig dass ich die Actors einfach als NSMutableArray speichere?

    ::Edit... ist es vielleicht falsch dass ich mit ContentValues Binde?
    Wenn ich versuche einfach nur den "Content" zu binden regt er sich auf und sagt:

    Quellcode

    1. [<Actor 0x162587d0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key title.


    Kann ich nicht irgendwie sagen, dass es beim ändern des selectedObjects das dem ArrayController mitteilt? So wie es die TableView ja auch macht?
  • Bitte :)

    Beim selectedObject Binding gibt es sicher mehrere Möglichkeiten. Mach's doch einfach so, wie ich's gemacht habe. Wäre ggf. später ja auch einfach änderbar.

    Actors=NSMutableArray dürfte so passen.

    Zu Deiner PM:
    Du könntest es so angehen:
    Laß add: des ArrayControllers den Actor anlegen. Dann hast Du einen leeren Actor, der durch den Benutzer befüllt wird. Also zuerst Anlage, danach Felder füllen. Gleichzeitig hättest Du damit eine Editiermöglichkeit für den Benutzer. Im Init des Actors könntest Du die Felder ja "vorbefüllen".
    Umgekehrt (also zuerst Felder füllen, danach anlegen) könntest Du es über einen Dialog machen, z. B. mit einem Sheet. Das ist aber wesentlich aufwendiger.
    Wenn die Validierung nicht eine wichtige Rolle spielt, wovon ich nicht ausgehe, ist die erste Lösung sicher die einfachere.

    Statt des PopUps könntest Du - nicht nur wegen der Binding-Sache - einen TableView nehmen. Dann sieht der Benutzer auch gleich alle Actors eines Films und der TableView könnte gleichzeitig der Editierbereich sein - geht ja einfach mit Doppelklick.

    Noch was ganz anderes:
    Hast Du Dir Core Data schon mal angesehen? Das ist für Deine Anwendung sicher mehr als passend. Schau Dir mal dieses Beispiel an:
    developer.apple.com/cocoa/coredatatutorial/index.html

    No.
  • Wieso soll das Programm denn nicht speichern?

    Wenn Du nicht speichern willst, brauchst Du ja nur die save:-Methode, die von der Template kommt (Core Data App) oder die saveDocument:-Methode einer NSPersistentDocument-Subklasse (Core Data Document based App) zu überschreiben.

    Wenn das Ganze sowas wie eine Filmdatenbank werden soll, kannst Du ja die "Filmdatenbank" mit Core Data speichern und wenn Du ZUSÄTZLICH diese Ordnerstruktur haben willst, geänderte Datensätze mit einem Flag versehen und bei jedem Core-Data-Speichervorgang die Ordnerstruktur aktualisieren. Umgekehrt, Ordnerstruktur->CoreData ginge natürlich auch. Zweiteres ginge sogar soweit, daß Du einen oder mehrere Ordner des Dateisystems mit Deinem Programm "überwachen" könntest. Schau Dir dazu mal NSWorkspace an.
    Damit wäre Core Data so etwas wie ein superEinfachProgrammierterZuDurchsuchenderIndex und die Ordnerstruktur was separates für's Stöbern im Dateisystem.

    No.
  • Naja... wenn ich die Filme aus einem Ordner einlade, müssen sie ja noch nicht gespeichert werden.. erst sobald ich was ändere..
    Kann ich also sagen, dass meine Importfunktion noch keine Speicherung verlangt und erst dann, bei Änderungen gespeichert werden muss.
    Die Speicherung wäre einfach nur eine Änderung der jeweiligen nfo-Datei.
    Fürs erste reicht das mal so...