Domanda

Sto cercando di utilizzare un NSFontPanel per consentire all'utente di modificare un'impostazione del carattere a livello di applicazione. Dovrebbe funzionare in questo modo: l'utente fa clic su un pulsante, si apre un pannello di caratteri, scelgono un carattere e una dimensione e la loro selezione viene mantenuta.

Il seguente codice mostra il pannello:

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

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

La documentazione sembra suggerire che il metodo del mittente changeFont: (id) debba essere chiamato quando il carattere cambia; questo non accade nel mio caso.

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

Qualche idea su cosa potrei fare di sbagliato?

È stato utile?

Soluzione

L'oggetto su cui hai definito -changeFont: deve essere il primo risponditore o sopra di esso nella catena di risponditori. Non hai specificato dove hai definito il metodo, ma presumo sia su un oggetto controller che non si trova nella catena di responder.

Altri suggerimenti

includi questo:

[fontManager setTarget:self];
Il delegato di

?? NSFontManager esiste principalmente per filtrare i caratteri che fornisce al pannello dei caratteri tramite -fontManager: willIncludeFont: .

Come menziona kperryua, -changeFont: viene inviato nella catena del risponditore. Il pulsante che avvia il menu dei caratteri o la sua vista chiusa potrebbe essere un buon posto per mettere un risponditore per -changeFont: .

Potresti trovare Gestione dei font guida leggermente più utile del Pannello Font guida.

Il problema principale è questa riga:

[fontPanel makeKeyAndOrderFront:sender];

Rendendo il pannello dei caratteri la finestra della chiave, non ha idea di dove inviare messaggi di azione come -changeFont: a.

Ecco la mia implementazione funzionante. Il punto chiave è che dovresti rendere il tuo oggetto come il primo risponditore in cui hai implementato - (void) changeFont: (id) mittente

NSFontManager *fontManager = [NSFontManager sharedFontManager];

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

[panel orderFront:self];

Simple changeFont: riferimento all'implementazione - Gestione dei caratteri

-(void) changeFont:(id)sender
{
    //Here sender would be NSFontManager
    NSFont *oldFont = [self font];
    NSFont *newFont = [sender convertFont:oldFont];
    [self setFont:newFont];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top