Objective c NSFontManager选择返回null的字体
好的,我已经检查了整个S.O.和整个Google,我找不到我的代码有什么问题: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
- (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:消息来利用此功能。”