2011-10-01 13 views
19

Sto provando a modificare il contenuto di Windows, da un'altra classe, che è sottoclasse di NSViewController. Sto cercando il codice qui sotto, ma non fa nulla.Come ottenere la finestra principale (delegato app) da un'altra classe (sottoclasse di NSViewController)?

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

[NSApplication sharedApplication]mainWindow] // returns null 

Ho provato ad aggiungere

[window makeMainWindow]; 

in App classe Delegate, ma non aiuterà.

Mi sono perso qualcosa?

P.S. Anche io sono qui utilizzando il codice qui sotto per chiamare qualsiasi funzione di delegato nella mia classe,

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

ma mi chiedo è qualcosa di meglio, wihtout importazione di classe delegato. Qualcosa di simile

[[NSApplication sharedApplication]delegate]MyMethod]; 

(che dà avvertimento)

risposta

34

Per la mainWindow method the docs say:

Questo metodo potrebbe restituire nil carico se il file pennino della domanda non è finito, se il ricevitore non è attivo, o se l'applicazione è nascosta.

Ho appena creato un'applicazione di test rapido e ho messo il seguente codice:

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

nel mio metodo applicationDidFinishLaunching:aNotification, e in un metodo d'azione che ho collegato a un pulsante nella finestra principale della mia candidatura .

All'avvio, mainWindow era nullo, ma quando faccio clic sul pulsante (dopo che tutto è attivo e funzionante e visualizzato), lo mainWindow non era più nullo.

NSApplication fornisce altri metodi che si può essere utile a voi:

  • - windows - una matrice di tutte le finestre;
  • – keyWindow - dà la finestra che sta ricevendo l'input da tastiera (o zero);
  • – windowWithWindowNumber: - restituisce una finestra corrispondente al numero della finestra - se si conosce il numero della finestra il cui contenuto si desidera sostituire si potrebbe usare questo;
  • – makeWindowsPerform:inOrder: - invia un messaggio ad ogni finestra - si potrebbe usare questo per testare ogni finestra per vedere se è quello che ti interessa

Per quanto riguarda i metodi di chiamata sul delegate, quello che dici dà. un avvertimento funziona bene per me. Ad esempio, questo funziona senza avvisi:

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

Che cosa è esattamente l'avviso che si riceve? Stai cercando di chiamare un metodo che non esiste?

+0

Grazie lot.I hanno solo una finestra. Quindi probabilmente userò windows, per entrare in Array, e userò il primo oggetto in Array. Sui metodi sul delegato, l'hai provata da classi diverse come viewcontroller? quando lo chiamo, funziona bene, ma dà un avvertimento, che il delegato potrebbe non rispondere a quel metodo. – User1234

+0

Capisco cosa intendi ora delle chiamate dei delegati. Sfortunatamente il [[NSApplication sharedApplication] delegate] messaggio restituirà sempre un oggetto di tipo NSApplicationDelegate. Dovrai inviarlo al delegato della tua app se desideri inviarlo messaggi specifici per il tuo delegato dell'app. Potresti chiederlo come una domanda separata? –

+0

Penso che l'unico modo per farlo sia cast NSApplicationDelegate a delegato specifico e importarlo in classe. Grazie. – User1234

18

Combattere con MacOS ha appena capito tutto.

citazione di Apple:

MainWindow

Proprietà

La finestra principale dell'applicazione. (Sola lettura)

Discussione

Il valore di questa proprietà è pari a zero quando storyboard del app o file nib non è ancora carico finito. Potrebbe anche essere nulla quando l'app è inattiva o nascosta.

Se si dispone di una sola finestra nella vostra applicazione (che è il caso più usato) usare il codice seguente:

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

Promessa non sarà pari a zero, se l'applicazione ha le finestre.

+0

Sto commentando una domanda di 3 anni fa, ma anche questo non sembra funzionare. Non dovrebbe restituire qualcosa, visto che il ViewController in cui viene inserito il codice viene caricato durante il tentativo di ottenere la finestra? –

+0

Si incolla questo codice in viewDidLoad dovrebbe funzionare. Ovviamente se non hai finestre nella tua app, allora sarà nullo. – Borzh

+0

Grazie per la risposta. È in uno dei metodi tableView, in quanto è un delegato di NSTableView. Quindi non so perché non funzionerebbe, con una finestra che mostra i contenuti. –

0

Se la proprietà della finestra non è ancora impostato, provare a ritardare le cose fino a quando l'applicazione ha terminato il caricamento, in questo modo:

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1]; 
Problemi correlati