2009-09-22 9 views
7

Sto provando a mostrare un NSPanel come un foglio. Sto ingenuamente facendo qualcosa in questo modo:Come mostrare un NSPanel come foglio

SheetController *sheetController = [[[SheetController alloc] 
             initWithWindowNibName:@"Sheet"] autorelease]; 

[[NSApplication sharedApplication] beginSheet:sheetController.window 
           modalForWindow:self.window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

Per qualche motivo che mi sfugge, questo non funziona. Quando viene chiamata questa parte del codice, il foglio lampeggia momentaneamente (a causa del messaggio autorelease). Il foglio non è mai agganciato alla finestra.

Se qualcuno può indicarmi dove posso trovare maggiori informazioni, sarebbe molto apprezzato.

risposta

16

Sembra un caso classico di aver selezionato la casella "Visibile all'avvio" per il pannello in IB. Spegnilo.

+0

Spot on! Grazie molto. –

2

Sì, è necessario possedere questo controller per tutto il tempo in cui si desidera continuare a funzionare. Non puoi semplicemente crearlo, autorizzarlo automaticamente e lasciarlo morire, devi tenerlo premuto per tutto il tempo necessario.

+0

Durante la rimozione del messaggio di autorelease impedisce al pannello di scomparire, non è ancora agganciato alla finestra ... Sono davvero perplesso da questo. –

+2

Non basta semplicemente non autorizzarlo automaticamente. Questa è solo una perdita. Devi possedere ciò che hai creato e rilasciarlo quando hai finito (e * solo * allora). Per quanto riguarda il collegamento del controller alla finestra che controlla, è necessario assicurarsi di aver impostato la classe del proprietario del file, quindi collegare l'output 'window' del controller alla finestra. Fai entrambi quelli in IB. –

1

Non dimenticare che se stai provando a eseguire questo come un foglio "modale" (ovvero, esso riprende l'app fino a quando l'utente non lo abbandona), dovrai eseguire un nuovo ciclo di esecuzione.

Quello che hai fatto è stato mostrato il foglio, e quindi non ha spinto un nuovo ciclo, quindi il sistema operativo mostra solo il foglio, vede che non c'è motivo di mantenerlo in esecuzione, quindi lo spegne e riprende l'esecuzione sul prossimo linea:

io di solito faccio fogli seguente modo:

- (id)showPanelModalAgainstWindow: (NSWindow *)window 
{ 
    [[NSApplication sharedApplication] beginSheet: panelToShow 
       modalForWindow: window 
       modalDelegate: self 
       didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) 
       contextInfo: nil]; 

    [[NSApplication sharedApplication] runModalForWindow: panelToShow]; 
    if (m_returnCode == NSCancelButton) return nil; 
} 


- (void)sheetDidEnd:(NSWindow *)sheet 
     returnCode:(int)returnCode 
     contextInfo:(void *)contextInfo 
{ 
    UNUSED(sheet); 
    UNUSED(contextInfo); 
    m_returnCode = returnCode; 
} 

Poi, nei vostri accettare e/o annullare le routine dei pulsanti:

- (IBAction)continueButtonClicked:(id)sender 
{ 
    UNUSED(sender); 
    [[NSApplication sharedApplication] stopModal]; 
    [createAccountWizardPanel orderOut: nil]; 
    [[NSApplication sharedApplication] endSheet: createAccountWizardPanel 
             returnCode: NSOKButton]; 

} 

sono sicuro che c'è modo leggermente meno codice per farlo, ma non ho cercato di approfondirlo, perché in questo modo funziona perfettamente fino a questo punto ...

I commenti precedenti sulla durata del controller e degli oggetti del pannello sono anch'essi rilevante: assicurati di capire esattamente quali oggetti hai bisogno per la durata di vita quando mostri un pannello modale.

+0

Questo metodo è deprecato :( – ColdSteel

Problemi correlati