NSFontManager selectedFont返回null

Dav*_*vid 6 xcode cocoa objective-c nsfontpanel nsfontmanager

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

- (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]);
}
Run Code Online (Sandbox Code Playgroud)

弹出字体面板,但是当我选择字体时,控制台将返回(null)字体管理器的选定字体.谁知道我错过了什么?

谢谢

Ste*_*vin 14

Apple的文档说使用selectedFontin changeFont:可能会导致意外行为,并且" 强烈建议不要在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);
}
Run Code Online (Sandbox Code Playgroud)

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

另一件重要的事情是,convertFont:需要成为有效NSFont实例的参数.否则,convertFont:即使在中选择了字体,也将返回nil NSFontPanel.因此,将NSFont *font实例变量初始化为有效NSFont实例非常重要.