2011-11-26 31 views
6

¿Es posible crear una alerta totalmente personalizada? Lo estoy haciendo con hojas personalizadas ahora, pero me gustaría tener la característica que bloquea la hoja (como -[NSAlert runModal]).Crear un NSAlert totalmente personalizado

Solo quiero cambiar el fondo, realmente, y el color del texto, por supuesto.

+1

Técnicamente, no se llama una hoja si se está ejecutando en una forma de aplicación-modal. – JWWalker

+0

Una alerta de aplicación modal con color de fondo y texto personalizado parece que podría ser bastante desagradable. ¿Realmente * necesitas * hacer esto? ¿Has leído las [Directrices de interfaz humana de Mac] (http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/Intro/Intro.html)? –

+0

No es desagradable en absoluto, de verdad. Las alertas no se ajustan a mis necesidades, ya que estoy trabajando con una aplicación de pantalla completa y estoy usando 'NSStatusWindowLevel'. He leído esas pautas hace un tiempo, sí. – Fatso

Respuesta

5

Advertencia sobre la solución recomendada:

Este código hace que un desperdicio inútil y gastos generales:

for (;;) { 
    if ([NSApp runModalSession:session] != NSRunContinuesResponse) 
     break; 
} 

Este código se copia directamente desde la página de documentación de Apple - pero está destinado a mostrar al desarrollador donde se puede insertar un código significativo para la ejecución de fondo mientras se ejecuta el modal. Es decir, debe tener algún código entre el descanso y el corchete de cierre. Pero no hay un código real que se muestre en el ejemplo, y ejecutarlo así simplemente hace que la aplicación realice sondeos de la sesión repetidamente hasta que finaliza. Es como si el niño de dos años en el asiento trasero del automóvil en un viaje por carretera preguntara: "¿Ya llegamos? ¿Ya llegamos? ¿Ya llegamos? ..."

Si lo que desea es sencillo ejecución modal, donde su aplicación presenta una ventana modal y suspende la tramitación de las ventanas principales/fondo hasta que los extremos modales, utilice esto:

[NSApp runModalForWindow: self.window]; 

... y luego salir de la sesión modal cuando la ventana se cierra dejando caer esto en su subclase de controlador de ventana:

- (void)windowWillClose:(NSNotification *)notification { 
    [NSApp stopModal]; 
} 
+0

Vale, David, gracias por aclararlo. – Fatso

3

Necesitará una ventana personalizada con dibujo de vista personalizada, sin embargo, NSAlert no le permite cambiar su ventana. Por lo tanto, deberá escribir su propia subclase de controlador de ventana como NSAlert (aunque NSAlert es una subclase de NSObject).

2

miré un poco, y encontramos este trozo de código:

NSModalSession session = [NSApp beginModalSessionForWindow:sheetWindow]; 
for (;;) { 
    if ([NSApp runModalSession:session] != NSRunContinuesResponse) 
     break; 
} 
[NSApp endModalSession:session]; 

llamo

[NSApp stopModal] 

para finalizar la sesión. Ahora es mi código de forma más limpia :)

Cuestiones relacionadas