tools mac cocoa osx-lion xcode4.2 automatic-ref-counting cocoa-sheet

cocoa - mac - Mostrar una ventana de cacao como una hoja en Xcode 4(OSX 10.7.2) con ARC



xcode mac (2)

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 siempre aparece un error por varias razones indistinguibles.

Ninguna de las guías en línea está 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 detallar para mí una guía completa, 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.


Las cosas han cambiado en SDK 10.10 - creo que las llamadas son más simples de entender. 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.

Hoja de visualización

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 principal:

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

Y luego para ejecutar la hoja como en un bucle modal, también debe llamar a NSApp con:

- (NSInteger)runModalForWindow:(NSWindow *)aWindow

Hoja de cierre

Para cerrar la hoja, llame a la ventana principal:

- (void)endSheet:(NSWindow *)sheetWindow

Lo cual hace que finalice el comando de finalización de la llamada anterior, en el cual puede poner una llamada para detener la ejecución de la ventana modal llamando a 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


Tutorial para Xcode 4

Cree un nuevo proyecto y agregue lo siguiente a AppDelegate.h 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 MainMenu.xib .
Use la NSWindow existente.
Hazlo visible usando el siguiente botón:

Crea un nuevo NSPanel .
Agregue los NSButtons apropiados.

Conéctese Close del App Delegate la App Delegate .

Y seleccione endTheSheet .

Conectar Open al App Delegate la App Delegate .

Y seleccione showTheSheet .

Conecte el App Delegate la App Delegate al nuevo NSPanel .

Y selecciona theSheet .

Seleccione NSPanel y desactive Visible At Launch . (¡Paso esencial!)

Ahora haz clic en ejecutar y disfruta el resultado: