2009-09-12 26 views
5

我试图使用NSFontPanel来允许用户更改应用程序范围的字体设置。它应该是这样工作的:用户点击一个按钮,弹出一个字体面板,他们选择一种字体和一个尺寸,并且他们的选择被保留下来。在可可中使用NSFontPanel

下面的代码显示面板:

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

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

文档似乎表明changeFont:(ID)发送方法应被调用的字体改变时;这不是发生在我的情况。

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

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

+0

这个问题让我: 的http:// stackoverflow.com/questions/6147305/why-isnt-changefont-being-called-from-my-nsfontpanel – 2015-04-18 04:52:44

回答

1

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

+0

视图控制器的视图实际上被加载到另一个窗口;添加changeFont:到父级的ViewController工作。谢谢你的帮助。 – conmulligan 2009-09-13 13:05:27

1

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

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

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

1

的核心问题是这一行:

[fontPanel makeKeyAndOrderFront:sender]; 

通过使字体面板的主要窗口,它有不知道从哪里发送动作消息像-changeFont:对。

+0

我将它改为orderFrontFontPanel :;但问题实际上是与响应者链有关。谢谢。 – conmulligan 2009-09-13 13:06:43

6

包括此:

[fontManager setTarget:self]; 
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]; 
}