Вопрос

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

Есть идеи, что я могу делать не так?

Это было полезно?

Решение

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

Другие советы

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

[fontManager setTarget:self];
Делегат

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

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

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

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

[fontPanel makeKeyAndOrderFront:sender];

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

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