在Cocoa中使用NSFontPanel

时间:2009-09-12 17:46:49

标签: objective-c cocoa nsfontpanel

我正在尝试使用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
}

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

5 个答案:

答案 0 :(得分:7)

包括这个:

[fontManager setTarget:self];

答案 1 :(得分:1)

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

答案 2 :(得分:1)

NSFontManager的委托主要用于通过-fontManager:willIncludeFont:过滤它提供给字体面板的字体。

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

您可能会发现Font Handling指南比Font Panel指南更有用。

答案 3 :(得分:1)

核心问题是这一行:

[fontPanel makeKeyAndOrderFront:sender];

通过使字体面板成为关键窗口,它不知道在哪里发送动作消息,如-changeFont:to。

答案 4 :(得分:0)

这是我的工作实施。关键是你应该将你的对象作为你实现- (void)changeFont:(id)sender

的第一个响应者
NSFontManager *fontManager = [NSFontManager sharedFontManager];

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

[panel orderFront:self];

简单的changeFont:实现参考 - Font Handling

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