7

我正在尝试使用 NSFontPanel 来允许用户更改应用程序范围的字体设置。它应该像这样工作:用户单击一个按钮,弹出一个字体面板,他们选择一种字体和大小,并且他们的选择是持久的。

以下代码显示面板:

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

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

文档似乎建议在字体更改时调用 changeFont:(id)sender 方法;这在我的情况下没有发生。

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

关于我可能做错了什么的任何想法?

4

5 回答 5

9

包括这个:

[fontManager setTarget:self];
于 2011-09-03T22:00:01.870 回答
2

您在其上定义的对象-changeFont:必须是响应者链中的第一个响应者或在它之上。您尚未指定定义该方法的位置,但我假设它位于不在响应程序链中的控制器对象上。

于 2009-09-12T17:54:29.847 回答
1

NSFontManager的委托主要是为了过滤它提供给字体面板的字体-fontManager:willIncludeFont:

正如 kperryua 提到的,-changeFont:被发送到响应者链。启动字体菜单或其封闭视图的按钮可能是放置响应程序的好地方-changeFont:

您可能会发现字体处理指南比字体面板指南更有用。

于 2009-09-13T02:08:11.863 回答
1

核心问题是这一行:

[fontPanel makeKeyAndOrderFront:sender];

通过使字体面板成为关键窗口,它不知道将操作消息(如 -changeFont: 发送到何处)。

于 2009-09-13T11:00:40.340 回答
0

这是我的工作实现。关键是你应该让你的对象成为你实现的第一响应者- (void)changeFont:(id)sender

NSFontManager *fontManager = [NSFontManager sharedFontManager];

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

[panel orderFront:self];

简单的 changeFont:实现参考 -字体处理

-(void) changeFont:(id)sender
{
    //Here sender would be NSFontManager
    NSFont *oldFont = [self font];
    NSFont *newFont = [sender convertFont:oldFont];
    [self setFont:newFont];
}
于 2016-01-14T13:54:16.493 回答