it-swarm.com.de

Wie erhalte ich das Hauptfenster (App Delegate) von einer anderen Klasse (Unterklasse von NSViewController)?

Ich versuche, meinen Windows-Inhalt von einer anderen Klasse, der Unterklasse von NSViewController, zu ändern. Ich versuche den Code unten, aber er tut nichts.

[NSApplication sharedApplication]mainWindow]setContentView:[self view]]; //code in NSViewController

[NSApplication sharedApplication]mainWindow] // returns null

Ich habe versucht hinzuzufügen

[window makeMainWindow];

in der App Delegate-Klasse, aber es hilft nicht.

Habe ich etwas verpasst? 

P.S. Außerdem verwende ich den folgenden Code, um eine Delegatfunktion in meiner Klasse aufzurufen.

 [(appDelegate *) [[NSApplication sharedApplication]delegate]MyMethod];

aber ich frage mich, ob es etwas Besseres gibt, ohne die Klasse der Delegierten zu importieren. Etwas wie das 

[[NSApplication sharedApplication]delegate]MyMethod];

(es gibt Warnung)

20
User1234

Für die mainWindow-Methode sagen die Dokumente :

Diese Methode gibt möglicherweise null zurück, wenn die Nib-Datei der Anwendung nicht vollständig geladen wurde, der Empfänger nicht aktiv ist oder die Anwendung ausgeblendet ist.

Ich habe gerade eine Kurztestanwendung erstellt und folgenden Code eingegeben:

NSLog(@"%@", [[NSApplication sharedApplication] mainWindow]);

in meine applicationDidFinishLaunching:aNotification-Methode und in eine Aktionsmethode, die ich mit einer Schaltfläche im Hauptfenster meiner Anwendung verbunden habe.

Beim Start war mainWindow null, aber wenn ich auf die Schaltfläche klicke (nachdem alles läuft und angezeigt wird), war mainWindow nicht mehr null.

NSApplication bietet andere Methoden, die für Sie nützlich sein können:

  • - windows - ein Array aller Fenster;
  • – keyWindow - gibt das Fenster an, das Tastatureingaben empfängt (oder nichts);
  • – windowWithWindowNumber: - gibt ein Fenster zurück, das der Fensternummer entspricht. Wenn Sie die Nummer des Fensters kennen, dessen Inhalt Sie ersetzen möchten, können Sie dies verwenden.
  • – makeWindowsPerform:inOrder: - sendet eine Nachricht an jedes Fenster - Sie können damit jedes Fenster testen, um zu sehen, ob es das ist, an dem Sie interessiert sind.

Was das Aufrufen von Methoden für delegate angeht, ist das, was Sie sagen, eine Warnung für mich. Dies funktioniert beispielsweise ohne Warnungen:

NSLog(@"%@", [[[NSApplication sharedApplication]delegate] description]);

Was genau ist die Warnung, die Sie erhalten? Versuchen Sie, eine Methode aufzurufen, die nicht existiert?

37
Maurice Kelly

Der Kampf mit MacOS hat dies herausgefunden.

Apples Zitat:

hauptfenster

Eigentum

Das Hauptfenster der App. (schreibgeschützt)

Diskussion

Der Wert in dieser Eigenschaft ist null, wenn das Storyboard oder die Nib-Datei der App noch nicht vollständig geladen wurde. Es kann auch gleich null sein, wenn die App inaktiv oder hidden ist.

Wenn Sie nur ein Fenster in Ihrer Anwendung haben (das ist der am häufigsten verwendete Fall), verwenden Sie den nächsten Code:

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0];

Versprechen Sie, dass es nicht gleich Null sein wird, wenn die Anwendung Fenster hat.

19
Borzh

Wenn die Fenstereigenschaft noch nicht festgelegt ist, versuchen Sie, die Dinge zu verzögern, bis die App vollständig geladen ist:

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1];
0
Jeff