Использование NSFontPanel в Cocoa

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

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

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

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

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

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

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


person conmulligan    schedule 12.09.2009    source источник
comment
Эта проблема помогла мне: stackoverflow.com/questions/6147305/   -  person Mark E. Hamilton    schedule 18.04.2015


Ответы (5)


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

person kperryua    schedule 12.09.2009
comment
Представление контроллера представления фактически загружается в другое окно; добавление changeFont: в родительский ViewController сработало. Спасибо за вашу помощь. - person conmulligan; 13.09.2009

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

[fontManager setTarget:self];
person Snow    schedule 03.09.2011

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

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

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

person Jeremy W. Sherman    schedule 13.09.2009
comment
Правильная ссылка: Обработка шрифтов Apple - person VoodooBoot; 21.01.2021

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

[fontPanel makeKeyAndOrderFront:sender];

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

person Community    schedule 13.09.2009
comment
Я изменил его на orderFrontFontPanel:; но проблема была на самом деле с цепочкой ответчика. Спасибо. - person conmulligan; 13.09.2009

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

NSFontManager *fontManager = [NSFontManager sharedFontManager];

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

[panel orderFront:self];

Simple changeFont: Справочник по реализации — Обработка шрифтов

-(void) changeFont:(id)sender
{
    //Here sender would be NSFontManager
    NSFont *oldFont = [self font];
    NSFont *newFont = [sender convertFont:oldFont];
    [self setFont:newFont];
}
person Omkar    schedule 14.01.2016