• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Seit Gutenbergs Zeiten haben sich nicht nur Bücher über die ganze Welt verbreitet, sondern Buchstaben und Wörter begleiten uns allumfassend. Selbst moderne Devices mit Sprachsteuerung und Super-KI kommen nicht ohne Buchstaben, Wörter oder Symbole aus. Nicht zuletzt darum ist das Thema das Monats Am Anfang war das Wort ---> 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?
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
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.
 

souljumper

Roter Delicious
Registriert
07.10.08
Beiträge
90
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?
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Hallo,

in solchen Fällen hilft ein Beispielprojekt. ;)

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

Viele Grüße
 

Anhänge

  • WindowTest.zip
    31,4 KB · Aufrufe: 56

souljumper

Roter Delicious
Registriert
07.10.08
Beiträge
90
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?
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
NSWindowController: -windowDidLoad -> überschreiben und initialisierungen vornehmen oder gleich Bindings benutzen
 

souljumper

Roter Delicious
Registriert
07.10.08
Beiträge
90
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.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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