NSFontManager selectedFont возвращает ноль
Итак, я проверил все 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)
для выбранного шрифта диспетчера шрифтов. Кто-нибудь знает, что мне не хватает?
Спасибо
1 ответ
Документация Apple гласит, что с помощью selectedFont
в changeFont:
может привести к непредвиденному поведению и "Использование selectedFont изнутри changeFont: настоятельно не рекомендуется." Соответствующий способ получить шрифт из 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
, По этой причине важно инициализировать NSFont *font
переменная экземпляра к действительному NSFont
пример.