2009-05-02 17 views
34

Me sorprende que esto no ocurra automáticamente, pero me gustaría que la ventana de mis aplicaciones se abra automáticamente cuando se hace clic en el icono Dock.¿Cómo se abre la ventana de la aplicación cuando se hace clic en el icono del dock?

Solo para aclarar, cuando abro la aplicación, la ventana se abre automáticamente, pero cuando hago clic en la cruz de la ventana pero dejo la aplicación ejecutándose, la ventana no se abre cuando hago clic en el icono de dock.

+1

Esto sucede automáticamente. ¿Puedes ser mas específico? –

Respuesta

64

Implementar - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag en delegado de la aplicación. Verifique la documentación para los detalles del valor de retorno.

Las aplicaciones basadas en documentos y las aplicaciones no basadas en documentos se comportan de forma ligeramente diferente. Si no hay ventanas abiertas cuando se hace clic en el icono del dock de una aplicación basada en documentos, se creará un nuevo documento. Si no hay ventanas abiertas cuando se hace clic en el icono del muelle de una aplicación que no está basada en documentos, entonces no hará nada.

+0

¡Muchas gracias! – Joshua

+0

qué tal si tengo dos ventanas abiertas, la ventana principal y la ventana secundaria. La ventana secundaria tiene un enfoque. Necesito configurar la ventana principal enfocada después de hacer clic en el ícono del dock. – BUDDAx2

5

Una aplicación basada en documentos abrirá automáticamente un nuevo documento sin título cuando la aplicación se active, por lo que supongo que se refiere a una aplicación que no está basada en documentos.

Implemente el método applicationDidBecomeActive: en su delegado de aplicación y abra/muestre la ventana.

Editar:

Parte de la información en Delegates.

Parte de la información en Opening and Closing Windows y la NSWindow API

+0

No entiendo cómo puedo implementar el método applicationDidBecomeActive :. ¿Me puede dar un código recortado/ejemplo/ – Joshua

+0

¿Dónde está la casilla de verificación para ocultar al cargar en IB? – Joshua

+0

@Joshua - Lo siento, es exactamente lo contrario. Si selecciona el inspector para la ventana en el archivo de punta, asegúrese de que esté marcado "Visible al iniciar". –

9

Esto es lo que estoy haciendo para que la ventana principal de una aplicación no basada en documentos vuelva a la pantalla una vez que se ha cerrado. Sé que esta podría no ser la manera correcta de hacerlo, pero hasta ahora me funciona.

Implementado esto en AppDelegate, la ventana se define como la variable de instancia del mismo objeto.

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender 
{ 
    [window makeKeyAndOrderFront:self]; 
    return NO; 
} 

Si alguien tiene una solución mejor responda. ¡Gracias!

+0

Estaba tratando de resolver esto también (cómo mostrar otra ventana para una aplicación basada en documentos) y esto funcionó perfecto! – Kyle

10
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag 
{ 
    if (flag) { 
     return NO; 
    } 
    else 
    { 
     [YourWindow makeKeyAndOrderFront:self];// Window that you want open while click on dock app icon 
     return YES; 
    } 
} 
2

soluciones A para añadir a la respuesta aceptada:

Con la respuesta aceptada la ventana reabierto no reaccionó a los eventos del ratón más.

Al utilizar la respuesta aceptada, también debe asegurarse de desmarcar "Liberar cuando se cierre" en el Inspector de Atributos de la ventana en IB. Esto soluciona el problema de la ventana que no responde.

1

Como señalaron otros, usar el método applicationShouldHandleReopen para volver a abrir ventanas cerradas en aplicaciones que no son de documentos es la manera correcta. El único cambio que deseo agregar es una forma más flexible de verificar qué ventana debe volver a mostrarse, al recorrer la lista de NSApplication visible e invisible de .windows y verificar la ventana requerida.

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { 

    if flag == false { 

     for window in sender.windows { 

      if (window.delegate?.isKind(of: WelcomeWindowController.self)) == true { 
       window.makeKeyAndOrderFront(self) 
      } 
     } 
    } 

    return true 
} 

Apéndice

a) Si la ventana estaba oculto a continuación, se mostró de forma automática cuando el usuario hará clic en el icono del muelle de aplicación, por lo hay necesidad de implementar applicationShouldHandleReopen método.

b) Controlado "Liberar cuando está cerrado" La opción no afecta de ninguna manera al comportamiento anterior.

Cuestiones relacionadas