web-dev-qa-db-fra.com

Comment obtenir la fenêtre principale (délégué d'application) d'une autre classe (sous-classe de NSViewController)?

J'essaie de changer le contenu de Windows, d'une autre classe, c'est la sous-classe de NSViewController. J'essaie le code ci-dessous, mais cela ne fait rien.

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

[NSApplication sharedApplication]mainWindow] // returns null

J'ai essayé d'ajouter

[window makeMainWindow];

dans la classe App Delegate, mais cela ne vous aidera pas.

Ai-je manqué quelque chose? 

P.S. J'utilise aussi le code ci-dessous pour appeler n'importe quelle fonction de délégué de ma classe,

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

mais je me demande s'il y a quelque chose de mieux, sans importer la classe des délégués. Quelque chose comme ça 

[[NSApplication sharedApplication]delegate]MyMethod];

(il donne un avertissement)

20
User1234

Pour la méthode mainWindow, les docs disent :

Cette méthode peut renvoyer nil si le chargement du fichier nib de l’application n’est pas terminé, si le récepteur n’est pas actif ou si l’application est masquée.

Je viens de créer une application de test rapide et j'ai placé le code suivant:

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

dans ma méthode applicationDidFinishLaunching:aNotification et dans une méthode d'action que j'ai connectée à un bouton de la fenêtre principale de mon application.

Au démarrage, la mainWindow était nulle, mais lorsque je clique sur le bouton (une fois que tout est opérationnel, et affichée), la mainWindow n'était plus nulle.

NSApplication fournit d’autres méthodes qui pourraient vous être utiles:

  • - windows - un tableau de toutes les fenêtres;
  • – keyWindow - donne la fenêtre qui reçoit une entrée au clavier (ou nil);
  • – windowWithWindowNumber: - renvoie une fenêtre correspondant au numéro de la fenêtre. Si vous connaissez le numéro de la fenêtre dont vous souhaitez remplacer le contenu, vous pouvez l'utiliser.
  • – makeWindowsPerform:inOrder: - envoie un message à chaque fenêtre - vous pouvez l'utiliser pour tester chaque fenêtre et voir si c'est celle qui vous intéresse.

En ce qui concerne les méthodes d’appel sur la delegate, ce que vous dites donne un avertissement me convient parfaitement. Par exemple, cela fonctionne sans avertissements:

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

Quel est exactement l'avertissement que vous recevez? Essayez-vous d'appeler une méthode qui n'existe pas?

37
Maurice Kelly

Se battre avec MacOS vient de le comprendre.

Citation d'Apple:

fenêtre principale

Propriété

La fenêtre principale de l'application. (lecture seulement)

Discussion

La valeur de cette propriété est nil lorsque le chargement du storyboard ou du fichier nib de l’application n’est pas terminé. Il peut également être nul lorsque l'application est inactive ou hidden .

Si vous n'avez qu'une fenêtre dans votre application (qui est le cas le plus utilisé), utilisez le code suivant:

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

Promettez que ce ne sera pas nul, si l'application a des fenêtres.

19
Borzh

Si la propriété window n'est pas encore définie, essayez de retarder le chargement de l'application, comme suit:

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