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 пример.

Другие вопросы по тегам