• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Auf "Kindfenster" zugreifen

souljumper

Roter Delicious
Registriert
07.10.08
Beiträge
90
Hi ich hab mr ne GUI im IB zusammengebaut und diese soweit mit Funktionen befüllt. Jetzt soll beim "Hinzufügen" ein neues Fenster aufgehen.

Dafür hab ich mir im IB ein neues NSWindow gemacht und zusammengklickt, für dieses Fenster habe ich mir dann ein Controller mit NSObject gemacht - eigentlich analog zu meinem Hauptfenster.

Nun möchte ich über mein Hauptfenster mein Kindfenster steuern (visible, invisible, Feldinhalte besetzen etc.). Dafür dachte ich jetzt ich instanziere mir den Kontroller des Kindes im Kontroller des hauptfensters. Nun sagt mir Xcode, dass der Kontroller wohl kein alloc hat...

Wie kann mein Kindefenster kontrollieren, kann ja sein, dass ich es auch ganz falsch gemacht hab?
 
alloc wird von NSObject geerbt, müsste also vorhanden sein, vlt. ein Tipfehler?
Leite Deine Fenster-Kontroller am besten von NSWindowController ab anstatt von NSObject. Den ganzen Nib-Kram (Laden/Speicherverwaltung/Responderchain) bekommst Du dann gratis.

Im Grunde bist Du auf dem richtigen Weg, schau Dir mal showWindow: von NSWindowController an.
 
Hm,

also ich hab mir jetzt ein neues xib-File gemacht wo mein NSWindow mit Controller drin ist und meinen Kindkontroller von NSWindowController erben lassen:

So erzeuge ich meinen
Code:
[editEntryController =[EditEntryController alloc] initWithWindowNibName:@"EditEntry"];
Das Fenster erscheint und wenn ich auf die Buttons klicke, krieg ich auch die NSLog-Meldungen die ich für die buttons hinterlegt hab als platzhalter.

Versuche ich jetzt aber ein Feld zu setzen:
Code:
[editEntryController setName:@"test"]
Passiert nichts, die Methode gibt es sicherlich, auch keine Kompilieungsfehler/warnung, aber der Aufruf errreicht irgendwie das Fenster nicht. Die Gui selber läuft von dem neuen fenster, nur die Kontroller interaktion klappt nicht...woran kann das noch liegen?

@edit
Denke mein Problem ist folgendes, die Gui wird samt kontroller erstellt (automatisch) und ich erzeuge mir dann per Hand einen neuen Kontroller, was aber nicht der ist, der zur kind-GUI gehört. Kann ich irgendwie den WindowController abrufen bzw. erhalten von einer anderen GUI?
 
Hallo,

in solchen Fällen hilft ein Beispielprojekt. ;-)

Beachte, dass im XIB "SomeWindowController" der Owner ist.

Viele Grüße
 

Anhänge

Danke, funktioniert jetzt mit der Kontrolle über das Kindfenster.

Allerdings hab ich beim ersten Anzeigen des Fenster das Problem, das gesetzte Texte in den TextFeldern niht angezeigt werden. Die Maske kommt leer hoch. Erst wenn ich die Aktion ein zweites mal ausführe werden die TextFelder neu gefüllt. Danach wird jede Veränderungen der Feldinhalte auch so aktualisiert wie ich das erwarten würde. Nur beim ersten mal anzeigen gibts scheinbar ein Problem. Hast du eine Idee was das sein könnte?
 
NSWindowController: -windowDidLoad -> überschreiben und initialisierungen vornehmen oder gleich Bindings benutzen
 
hm... ich habs jetzt so gemacht:

Wenn ich mir mein NSWindowController erzeugt hab mit alloc/init, sag ich ein mal
Code:
    [[editEntryWindow window] orderOut:self];

und mache das bei der Erzeugung (über IB eingestellt) ohnehin unsichtbare Fenster erneut unsichtbar. Ist für mich in diesem Fall ok, weil ich das zweite Fenster definitiv nicht vor der haupt-gui sehen will.

Wenn ich dann einen Wert setze und später showWindow sage, klappts auch beim ersten mal.

Was für eine Art von Initialisierung sollte man den in windowDidLoad machen um mein Problm zu umgehen? Wüsste jetzt nicht was ich da noch initialisiern soll ? Evtl. hab ich es auch falsch hochgezogen, mein Kontroller ovm Hauptfenster hat jetzt auch nen Zeiger auf de Kontroller von meinem Kindefenster. Damit steuert der Hauptkontroller also alle GUI-Elemente.
 
Dein Vorgehen liest sich für mich definitiv falsch.
Ohne Dein Projekt lässt sich das aber schwer beurteilen.
Du solltest Dir aber generell merken, dass wenn Du etwas "faken" musst machst Du höchstwahrscheinlich etwas falsch.

Viele Grüße