Используя NSFontPanel в Какао
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать 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];
}