Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSFontManager选择返回null的字体_Objective C_Xcode_Cocoa_Nsfontpanel_Nsfontmanager - Fatal编程技术网

Objective c NSFontManager选择返回null的字体

Objective c NSFontManager选择返回null的字体,objective-c,xcode,cocoa,nsfontpanel,nsfontmanager,Objective C,Xcode,Cocoa,Nsfontpanel,Nsfontmanager,好的,我已经检查了整个S.O.和整个Google,我找不到我的代码有什么问题: - (IBAction)selectFont:(id)sender { NSFontManager *fontManager = [NSFontManager sharedFontManager]; [fontManager setDelegate:self]; [fontManager setTarget:self]; NSFontPanel *fontPanel = [fontM

好的,我已经检查了整个S.O.和整个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)
。有人知道我错过了什么吗

谢谢

苹果公司表示,在
changeFont:
中使用
selectedFont
可能会导致意外行为,并且“强烈反对在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);
}
@接口AppDelegate:NSObject{
NSFont*字体;
}
-(iAction)选择字体:(id)发件人;
@结束
@实现AppDelegate
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知
{
font=[NSFont boldSystemFontOfSize:12];
}
-(iAction)选择字体:(id)发件人
{
NSFontManager*fontManager=[NSFontManager-sharedFontManager];
[fontManager setDelegate:self];
[fontManager设置目标:自我];
[fontManager命令FrontFontPanel:self];
}
-(无效)更改字体:(id)发件人
{
font=[font:font];
NSLog(@“%@”,字体);
}
我已经删除了一些与您的问题无关的代码(如iBouts到NSButtons和NSWindow)。
请注意,此示例使用ARC


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

嗯,我不知道为什么转换我现有的字体变量是有效的…但没关系。谢谢!一个常见的误解是NSFontPanel用于创建新的字体对象。摘自David Chisnall的《可可编程-开发人员手册》,“字体面板更复杂。它将更新发送到字体管理器。这是Cocoa文本系统的核心部分,负责处理与字体转换的交互。在“字体”面板中调整属性时,它不会创建新的字体说明。字体面板和NSFontManager跟踪对字体所做的更改。在第21行,我们通过向字体管理器发送convert:消息来利用此功能。”