2011-11-08 7 views
32

Sto cercando di ottenere una finestra di login da visualizzare come foglio dalla mia finestra principale, ma ogni volta che provo ad implementare i metodi di AppKit un errore appare sempre per vari motivi indistinguibili.Visualizzazione di una finestra di cacao come foglio in Xcode 4 (OSX 10.7.2) con ARC

Nessuna delle guide online disponibili funziona, quando applico il proprio codice/classi adattate al mio progetto non funzionano mai.

La maggior parte delle guide sono obsolete, compresa la documentazione Apple. E nessuno di loro sembra essere compatibile con il conteggio dei riferimenti automatico. O le interfacce Xcode 4.

Sarebbe qualcuno in grado di dettagliare per me una guida completa, per il modo più semplice di visualizzare un foglio dopo la pressione di un pulsante sulla Finestra principale.

Non esitate a chiedere maggiori informazioni se ne avete bisogno.

risposta

92

Tutorial per Xcode 4

Creare nuovo progetto e aggiungere il seguente al AppDelegate.h e AppDelegate.m.

AppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 

    IBOutlet NSPanel *theSheet; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 

- (IBAction) showTheSheet:(id)sender { 

    [NSApp beginSheet:theSheet 
     modalForWindow:(NSWindow *)_window 
     modalDelegate:self 
     didEndSelector:nil 
      contextInfo:nil]; 

} 

-(IBAction)endTheSheet:(id)sender { 

    [NSApp endSheet:theSheet]; 
    [theSheet orderOut:sender]; 

} 

@end 

Aprire il MainMenu.xib.
Utilizzare lo NSWindow esistente.
renderla visibile utilizzando il pulsante seguente:

Xcode

crearne uno nuovo NSPanel.
Aggiungere l'appropriato NSButtons.

Xcode

Collegare Close al App Delegate.

Xcode

E selezionare endTheSheet.

Xcode

Collegare Open al App Delegate.

Xcode

E selezionare showTheSheet.

Xcode

Collegare il App Delegate alla nuova NSPanel.

Xcode

E selezionare theSheet.

Xcode

Selezionare il NSPanel e disattivare Visible At Launch. (! Passo essenziale)

Xcode

Ora ha colpito corsa e godersi il risultato:

Xcode

+8

Sei incredibile! quegli screenshot sono davvero carini e utili, grazie mille. –

+0

Domanda ad Anne nell'esempio sopra: se dovessi aggiungere un NSTextField al foglio, come potrei trasferire il testo avanti e indietro tra il foglio e la sua finestra genitore? – Woofy

+0

Sono passato attraverso questo oggi. Estremamente utile grazie! – Hassan

5

Le cose sono cambiate nel SDK 10.10 - le chiamate sono più semplici da capire credo. Una finestra genitore si occupa di avviare un NSWindow figlio come un foglio - e quindi si passa questo NSWindow figlio a NSApp per eseguire modally. Quindi fai il contrario per scartare.

Visualizzazione foglio

Per visualizzare il foglio invece di chiamare:

[NSApp beginSheet:theSheet 
    modalForWindow:(NSWindow *)_window 
    modalDelegate:self 
    didEndSelector:nil 
     contextInfo:nil]; 

È ora di chiamare sulla finestra padre:

(void)beginSheet:(NSWindow *)sheetWindow 
completionHandler:(void (^)(NSModalResponse returnCode))handler 

E poi di eseguire il foglio come in ciclo modale, devi anche chiamare NSApp con:

- (NSInteger)runModalForWindow:(NSWindow *)aWindow 

Chiusura Sheet

per chiudere la finestra, invitare la finestra padre:

- (void)endSheet:(NSWindow *)sheetWindow 

che provoca la completionHandler dalla chiamata sopra al fuoco, - in cui è possibile mettere una chiamata per fermare l'esecuzione della finestra modale chiamando NSApp con:

- (void)stopModalWithCode:(NSInteger)returnCode 

esempio completa

@implementation AppDelegate 

@synthesize window = _window; 

- (IBAction) showTheSheet:(id)sender { 

    [_window beginSheet: theSheet 
     completionHandler:^(NSModalResponse returnCode) { 
      [NSApp stopModalWithCode: returnCode]; 
     }]; 

    [NSApp runModalForWindow: theSheet]; 

} 

-(IBAction)endTheSheet:(id)sender { 
    [_window endSheet: theSheet]; 
} 

@end 
+1

Se questo non dovrebbe essere qui (dato che il titolo è specifico per xcode 4, per favore fatemelo sapere prima del downvoting e lo rimuoverò) –

+2

Bisogna dire che la finestra del foglio deve essere nascosta prima che beginSheet venga chiamato altrimenti sembra un foglio ma non è allegato. – Lothar

Problemi correlati