2010-05-28 23 views
16

¿Cómo hacer que una aplicación Cocoa se cierre cuando la ventana principal está cerrada? Sin eso, tiene que hacer clic en el ícono de la aplicación y hacer clic en Salir en el menú.¿Se cierra la aplicación Cocoa cuando la ventana principal está cerrada?

+2

Aunque esta es una pregunta válida, reconsidere hacerlo. Si su aplicación necesita tener siempre su ventana principal presente, deshabilite la posibilidad de cerrarla. –

+1

Bastante justo, lo haré. ¡Gracias! –

+13

No estoy de acuerdo. En la mayoría de las aplicaciones de una sola ventana, incluida la Calculadora y (hoy en día) las Preferencias del Sistema, puede cerrar la ventana y al hacerlo sale de la aplicación. Y personalmente he usado aplicaciones que se hicieron al revés, y me sentí frustrado cuando traté de cerrar la ventana principal y recibí un pitido en lugar de cerrar/cerrar lo que quería. –

Respuesta

23

Puede implementar applicationShouldTerminateAfterLastWindowClosed: para devolver SÍ en el delegado de su aplicación. Pero lo pensaría dos veces antes de hacer esto, ya que es realmente inusual en la Mac fuera de pequeñas aplicaciones de "utilidad" como Calculator y la mayoría de los usuarios de Mac no apreciarán que su aplicación se comporte de forma tan extraña.

+3

En realidad, Apple rechazó mi aplicación una vez y me sugirió que implementara esto. Dijeron que necesitaba una forma clara de volver a abrir la ventana principal o implementar "applicationShouldTerminateAfterLastWindowClosed" –

+1

@nute: Bueno, sí, debería haber una manera fácil de volver a abrir una ventana. Una aplicación en la que haga clic en el ícono y no ocurra nada aparente no es un buen UX. Eso está muy lejos de decir que las aplicaciones en general deberían dejar de funcionar cuando se cierra la última ventana. – Chuck

6

Debe tener un IBOutlet en su ventana principal. Por ejemplo: IBOutlet NSWindow * mainWindow;

- (void)awakeFromWindow { 
    [mainWindow setDelegate: self]; 
} 
- (void)windowWillClose:(NSNotification *)notification { 
    [NSApp terminate:self]; 
} 

Si esto no funciona, se debe añadir un observador a su NSNotificationCenter para la notificación NSWindowWillCloseNotification. No olvide verificar si la ventana derecha se está cerrando.

10

Añadir este fragmento de código al delegado de su aplicación:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app { 
    return YES; 
} 
4

Como la cuestión es sobre todo acerca de la programación de cacao y no se trata de una específica idioma (Objective-C), aquí está la versión Swift de Chuck y Steve de respuesta:

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool { 
     return true 
    } 

    // Your other application delegate methods ... 

} 

para Swift 3 cambio de la definición del método de

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 
    return true 
} 
+1

He agregado esta respuesta en el espíritu de la meta pregunta [¿Las nuevas respuestas de Swift en las viejas preguntas de Objective-C son beneficiosas?] (Http://meta.stackoverflow.com/questions/303338/are-new-swift-answers- on-old-objective-c-questions-beneficial), y porque cerré una pregunta más nueva pidiendo explícitamente código Swift como duplicado de este. –

+0

Swift 3 requiere un guión bajo y espacio antes del texto del remitente. – dylan

+0

@dylan: ¡Sí, gracias! –

Cuestiones relacionadas