NSFontManager selectedFont返回null

时间:2012-11-28 21:29:18

标签: objective-c xcode cocoa nsfontpanel nsfontmanager

好的,所以我已经检查过S.O.谷歌和我无法找到我的代码有什么问题:

- (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)所选字体的字体。谁知道我错过了什么?

由于

1 个答案:

答案 0 :(得分:14)

Apple的Documentation表示在selectedFont中使用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);
}

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

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