2009-09-22 9 views
7

Estoy tratando de mostrar un NSPanel como una hoja. Estoy ingenuamente haciendo algo en esa línea:Cómo mostrar un NSPanel como una hoja

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

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

Por alguna razón que me elude, esto no está funcionando. Cuando se llama a esta parte del código, la hoja parpadea momentáneamente (debido al mensaje autorelease). La hoja nunca se engancha a la ventana.

Si alguien me puede indicar dónde puedo encontrar más información, eso sería muy apreciado.

Respuesta

16

Esto suena como un caso clásico de haber marcado el cuadro "Visible en el lanzamiento" para el panel en IB. Apaga eso.

+0

Spot on! Muchas gracias. –

2

Sí, necesita tener este controlador el tiempo que desee para que continúe funcionando. No puede simplemente crearlo, soltarlo de nuevo y dejarlo morir; necesita retenerlo todo el tiempo que lo necesite.

+0

Al eliminar el mensaje de liberación automática evita que el panel desaparezca, todavía no está enganchado a la ventana ... Estoy realmente perplejo por esto. –

+2

No es suficiente simplemente no liberarlo automáticamente. Eso es solo una filtración. Necesita tener lo que ha creado y liberarlo cuando haya terminado con él (y * solo * luego). En cuanto a conectar el controlador a la ventana que controla, debe asegurarse de haber configurado la clase del Propietario del archivo y luego conectar la salida de "ventana" de su controlador a la ventana. Haces ambas cosas en IB. –

1

No olvide que si intenta ejecutar esto como una hoja "modal" (es decir, se hace cargo de la aplicación hasta que el usuario la rechace), tendrá que pulsar un nuevo ciclo de ejecución.

Lo que ha hecho se muestra en la hoja, y luego no se presiona un nuevo bucle, por lo que el sistema operativo solo muestra la hoja, ve que no hay razón para mantenerlo en ejecución y lo apaga y reanuda la ejecución en el siguiente línea:

me suelen hacer hojas de la siguiente manera:

- (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; 
} 

Luego, en sus rutinas de aceptar y/o botón de cancelación:

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

} 

estoy seguro de que es tan ligeramente menos código-modo de hacer esto, pero no he mirado profundamente en él, porque de esta manera funciona perfectamente bien hasta ahora ...

Los comentarios anteriores sobre la vida útil del controlador y los objetos del panel también relevante: asegúrese de comprender exactamente qué objetos necesita para qué vidas al mostrar un panel modal.

+0

Este método está en desuso :( – ColdSteel

Cuestiones relacionadas