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: