6

好的,所以我检查了整个 SO 和 Google,但我找不到我的代码有什么问题:

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

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

- (void)changeFont:(id)sender
{
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    font = [fontManager selectedFont];
    NSLog(@"%@",[fontManager selectedFont]);
}

字体面板弹出,但是当我选择一种字体时,控制台会返回(null)字体管理器的所选字体。有人知道我错过了什么吗?

谢谢

4

1 回答 1

14

Apple 的文档说使用selectedFontinchangeFont:可能会导致意外行为,并且“强烈建议不要在 changeFont: 中使用 selectedFont。 ”获取字体的适当方法NSFontPanel是要求NSFontManager将当前字体转换为所选字体。这是一个正确使用的示例应用程序NSFontPanel

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    NSFont *font;
}

- (IBAction)selectFont:(id)sender;

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    font = [NSFont boldSystemFontOfSize:12];
}

- (IBAction)selectFont:(id)sender
{
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    [fontManager setDelegate:self];
    [fontManager setTarget:self];
    [fontManager orderFrontFontPanel:self];
}

- (void)changeFont:(id)sender
{
    font = [sender convertFont:font];
    NSLog(@"%@", font);
}

我已经删除了与您的问题无关的代码片段(例如 IBOutlets 到 NSButtons 和 NSWindow)。
请注意,此示例使用 ARC。

另一件重要的事情是,参数 toconvertFont:需要是一个有效的NSFont实例。否则,convertFont:即使在NSFontPanel. 因此,将NSFont *font实例变量初始化为有效NSFont实例很重要。

于 2012-11-28T22:40:24.210 回答