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

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

6 голосов
/ 12 сентября 2009

Я пытаюсь использовать 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 ]

7 голосов
/ 04 сентября 2011

включают это:

[fontManager setTarget:self];
1 голос
/ 13 сентября 2009
Делегат

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

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

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

1 голос
/ 13 сентября 2009

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

[fontPanel makeKeyAndOrderFront:sender];

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

1 голос
/ 12 сентября 2009

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

0 голосов
/ 14 января 2016

Вот моя рабочая реализация. Ключевым моментом является то, что вы должны сделать свой объект первым респондентом, где вы реализовали - (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];
}
...