2011-11-08 7 views
32

Estoy tratando de obtener una ventana de inicio de sesión para mostrar como una hoja de mi ventana principal, pero cada vez que intento implementar los métodos de AppKit un error siempre aparece por varias razones indistinguibles.Mostrar una ventana de cacao como una hoja en Xcode 4 (OSX 10.7.2) con ARC

Ninguna de las guías en línea están funcionando, cuando aplico su código/clases adaptadas a mi propio proyecto, nunca funcionan.

La mayoría de las guías están desactualizadas, incluida la documentación de Apple. Y ninguno de ellos parece ser compatible con el recuento automático de referencias. O las interfaces Xcode 4.

¿Alguien podría detallarme en su totalidad una guía, por la forma más sencilla de mostrar una hoja después de presionar un botón en la ventana principal.

No dude en solicitar más información si la necesita.

Respuesta

92

Tutorial para Xcode 4

Crear nuevo proyecto y añadir lo siguiente a AppDelegate.h y 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 

Abra la MainMenu.xib.
Utilice el NSWindow existente.
que sea visible usando el siguiente botón:

Xcode

Crear una nueva NSPanel.
Agregue el NSButtons apropiado.

Xcode

Conectar Close a la App Delegate.

Xcode

Y seleccione endTheSheet.

Xcode

Conectar a la OpenApp Delegate.

Xcode

Y seleccione showTheSheet.

Xcode

Conectar el App Delegate a la nueva NSPanel.

Xcode

Y seleccione theSheet.

Xcode

Seleccione la NSPanel y desactivar Visible At Launch. (! Paso esencial)

Xcode

Ahora Run Hit y disfrutar del resultado:

Xcode

+8

¡Estás volteando increíble! Esas capturas de pantalla son realmente agradables y útiles, muchas gracias. –

+0

Pregunta a Anne en la muestra anterior: si agregara un NSTextField a la hoja, ¿cómo podría transferir el texto de ida y vuelta entre la hoja y su ventana principal? – Woofy

+0

Se encontró con esto hoy. Extremadamente útil gracias! – Hassan

5

cosas han cambiado en SDK 10.10 - las llamadas son más simples de entender que pienso. Una ventana principal se encarga de iniciar una NSWindow infantil como una hoja, y luego pasa este NSWindow hijo a NSApp para que se ejecute de manera modal. Luego haz lo opuesto para desenvolver.

Viendo hoja

Para mostrar la hoja en lugar de llamar:

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

Ahora llama a la ventana padre:

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

Y a continuación, ejecutar la hoja como en bucle modal, también debe llamar a NSApp con:

- (NSInteger)runModalForWindow:(NSWindow *)aWindow 

lámina de cierre

Para cerrar la hoja, llamada en la ventana padre:

- (void)endSheet:(NSWindow *)sheetWindow 

que hace que el completionHandler de la llamada anterior al fuego, - en el que se puede poner una llamada para detener la ejecución de la ventana modal llamando NSApp con:

- (void)stopModalWithCode:(NSInteger)returnCode 

ejemplo completo

@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

Si esto no debería estar aquí (ya que el título es específico de xcode 4, hágamelo saber antes de la votación negativa y lo eliminaré) –

+2

Se debe decir que la ventana de la hoja debe estar oculta antes de llamar a beginSheet, de lo contrario parece una hoja pero no está adjunta. – Lothar

Cuestiones relacionadas