Используя NSFontPanel в Какао

Я пытаюсь использовать NSFontPanel, чтобы позволить пользователю изменить настройки шрифта в приложении. Он должен работать примерно так: пользователь нажимает кнопку, появляется панель шрифтов, они выбирают шрифт и размер, и их выбор сохраняется.

Следующий код показывает панель:

- (IBAction)showFontMenu:(id)sender {
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    [fontManager setDelegate:self];

    NSFontPanel *fontPanel = [fontManager fontPanel:YES];
    [fontPanel makeKeyAndOrderFront:sender];
}

Документация, кажется, предполагает, что метод отправителя changeFont:(id) должен вызываться при изменении шрифта; это не происходит в моем случае.

- (void)changeFont:(id)sender {
    // blah
}

Любые идеи о том, что я могу делать не так?

5 ответов

Решение

Объект, который вы определили -changeFont: должен быть включен первый респондент или выше его в цепочке респондентов. Вы не указали, где вы определили метод, но я предполагаю, что он находится на объекте контроллера, который не находится в цепочке респондента.

Включите это:

[fontManager setTarget:self];

Основная проблема заключается в этой строке:

[fontPanel makeKeyAndOrderFront:sender];

Сделав панель шрифтов ключевым окном, он не знает, куда отправлять сообщения действий, такие как -changeFont: to.

NSFontManagerДелегат существует главным образом для фильтрации шрифтов, которые он поставляет на панель шрифтов через -fontManager:willIncludeFont:,

Как упоминает Кперрюа, -changeFont: отправляется по цепочке респондента. Кнопка, которая запускает меню шрифтов или их вид, может быть хорошим местом для установки респондента для -changeFont:,

Возможно, вы найдете руководство по обработке шрифтов несколько более полезным, чем руководство по панели шрифтов.

Вот моя рабочая реализация. Ключевым моментом является то, что вы должны сделать свой объект первым респондентом, где вы реализовали - (void)changeFont:(id)sender

NSFontManager *fontManager = [NSFontManager sharedFontManager];

NSFontPanel *panel = [fontManager fontPanel:YES];
[[self window] makeFirstResponder:self];

[panel orderFront:self];

Простой changeFont: описание реализации - обработка шрифтов

-(void) changeFont:(id)sender
{
    //Here sender would be NSFontManager
    NSFont *oldFont = [self font];
    NSFont *newFont = [sender convertFont:oldFont];
    [self setFont:newFont];
}
Другие вопросы по тегам