2009-09-12 12 views
5

Estoy tratando de usar un NSFontPanel para permitir al usuario cambiar la configuración de fuente de toda la aplicación. Se supone que debe funcionar de la siguiente manera: el usuario hace clic en un botón, aparece un panel de fuente, elige una fuente y un tamaño, y su selección se conserva.Uso de NSFontPanel en Cocoa

El código siguiente muestra el panel:

- (IBAction)showFontMenu:(id)sender { 
    NSFontManager *fontManager = [NSFontManager sharedFontManager]; 
    [fontManager setDelegate:self]; 

    NSFontPanel *fontPanel = [fontManager fontPanel:YES]; 
    [fontPanel makeKeyAndOrderFront:sender]; 
} 

La documentación parece sugerir que el changeFont: (id) Método remitente debe llamar cuando cambia el tipo de letra; esto no está sucediendo en mi caso.

- (void)changeFont:(id)sender { 
    // blah 
} 

¿Alguna idea sobre lo que podría estar haciendo mal?

+0

Este problema me ayudó: http: // stackoverflow.com/questions/6147305/why-isnt-changefont-being-called-from-my-nsfontpanel –

Respuesta

1

El objeto que ha definido -changeFont: debe ser el primer respondedor o superior en la cadena de respuesta. No ha especificado dónde ha definido el método, pero supongo que está en un objeto controlador que no está en la cadena de respuesta.

+0

La vista del controlador de vista se está cargando en otra ventana; añadiendo changeFont: al ViewController del padre funcionó. Gracias por tu ayuda. – conmulligan

1

NSFontManager 's delegado existe principalmente para filtrar las fuentes que suministra al panel de fuentes a través de -fontManager:willIncludeFont:.

Como kperryua menciona, -changeFont: se envía a la cadena de respuesta. El botón que inicia el menú de fuente o su vista adjunta puede ser un buen lugar para poner un respondedor para -changeFont:.

Puede encontrar que la guía Font Handling es marginalmente más útil que la guía Font Panel.

1

El problema central es esta línea:

[fontPanel makeKeyAndOrderFront:sender]; 

Al hacer que el panel de la fuente de la ventana clave, que tiene ni idea de dónde enviar mensajes de acción como -changeFont: a.

+0

Lo cambié a orderFrontFontPanel :; pero el problema fue en realidad con la cadena de respuesta. Gracias. – conmulligan

6

incluyen lo siguiente:

[fontManager setTarget:self]; 
0

Aquí es mi aplicación de trabajo. punto clave es que usted debe hacer su objeto como el primer nivel de respuesta en la que han implementado - (void)changeFont:(id)sender

NSFontManager *fontManager = [NSFontManager sharedFontManager]; 

NSFontPanel *panel = [fontManager fontPanel:YES]; 
[[self window] makeFirstResponder:self]; 

[panel orderFront:self]; 

simple changeFont: Implementación de referencia - Font Handling

-(void) changeFont:(id)sender 
{ 
    //Here sender would be NSFontManager 
    NSFont *oldFont = [self font]; 
    NSFont *newFont = [sender convertFont:oldFont]; 
    [self setFont:newFont]; 
}