Mit NSFontPanel in Cocoa
-
06-07-2019 - |
Frage
Ich versuche, eine NSFontPanel zu verwenden, damit der Benutzer eine Anwendung weite Schrifteinstellung ändern. Es soll so etwas wie dies funktioniert:. Der Benutzer auf eine Schaltfläche klickt, eine Schrifttafel erscheint, sie eine Schriftart und Größe auswählen und ihre Auswahl beibehalten wird
Der folgende Code zeigt das Panel:
- (IBAction)showFontMenu:(id)sender {
NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager setDelegate:self];
NSFontPanel *fontPanel = [fontManager fontPanel:YES];
[fontPanel makeKeyAndOrderFront:sender];
}
Die Dokumentation scheint darauf hinzudeuten, dass die changeFont: (id) sender Methode soll, wenn die Schrift Änderungen genannt werden; dies ist in meinem Fall nicht passiert.
- (void)changeFont:(id)sender {
// blah
}
Alle Ideen, was ich falsch machen könnte?
Lösung
Das Objekt, das Sie -changeFont:
auf muss der Ersthelfer oder darüber in der Responder-Kette definiert haben. Sie haben nicht angegeben, wo Sie die Methode definiert haben, aber ich nehme an, es auf einem Controller-Objekt ist, das nicht in der Responder-Kette ist.
Andere Tipps
umfassen diese:
[fontManager setTarget:self];
NSFontManager
Delegierter besteht in erster Linie die Schriftarten zu filtern, um es in die Schrifttafel über -fontManager:willIncludeFont:
liefert.
Wie kperryua erwähnt, -changeFont:
wird die Responder-Kette geschickt. Die Schaltfläche, das Schriftart-Menü oder seine umschließenden Ansicht startet vielleicht ein guter Ort sein, ein Responder für -changeFont:
zu setzen.
Sie können die Font Handhabung Führung geringfügig nützlicher als die Font-Panel Führer.
Das Kernproblem ist diese Zeile:
[fontPanel makeKeyAndOrderFront:sender];
der Schrifttafel der Schlüssel Fenster Indem, wird es keine Ahnung, wo Aktion Nachrichten wie -changeFont senden. Zu
Hier ist meine Arbeits Umsetzung. Kernpunkt ist, dass Sie Ihre Aufgabe als Ersthelfer machen sollten, wo Sie - (void)changeFont:(id)sender
umgesetzt haben
NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFontPanel *panel = [fontManager fontPanel:YES];
[[self window] makeFirstResponder:self];
[panel orderFront:self];
Einfache changeFont: Implementierung Referenz - Fontbehandlung
-(void) changeFont:(id)sender
{
//Here sender would be NSFontManager
NSFont *oldFont = [self font];
NSFont *newFont = [sender convertFont:oldFont];
[self setFont:newFont];
}