我正在尝试使用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
}
关于我可能做错的任何想法?
答案 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];
}