NSFontPanel changeFont не вызывается

Я пытаюсь использовать панель шрифтов в своем приложении Cocoa и не могу вызвать метод changeFont:.

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

- (IBAction)onOpenFontPanelBtnClicked:(id)sender
{
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

    NSString* theFontName = [defaults objectForKey:DefaultFontNamePrefKey];
    NSFont* theFont = [NSFont fontWithName:theFontName size:12.0f];

    NSFontManager* fontMgr = [NSFontManager sharedFontManager];
    [fontMgr setTarget:self];
    [fontMgr setAction:@selector(changeMyCustomFont:)];

    NSFontPanel* panel = [fontMgr fontPanel:YES];
    [panel setPanelFont:theFont isMultiple:NO];
    [panel orderFront:self];
    panel.enabled = YES;

    NSLog(@"Font manager target: %@ (class: %@), action: %@", fontMgr.target, [fontMgr.target className], NSStringFromSelector(fontMgr.action));
}

- (void) changeMyCustomFont:(id)sender
{
    NSLog(@"New font: %@", [[NSFontManager sharedFontManager] selectedFont]);
}

Этот код вызывается из контроллера представления внутри модального окна (окна настроек), и панель шрифтов открывается просто отлично. Однако я не получаю никаких изменений, хотя я устанавливаю цель и действие вручную.

Эта проблема связана с цепочкой респондента? Как я могу это исправить? Нужно ли вручную добавлять контроллер представления в цепочку респондента? Как бы я это сделал?

Заранее спасибо!

1 ответ

Отвечая на мой вопрос, чтобы помочь другим, которые наткнулись на это в функции. Как я и предполагал, эта проблема была связана с цепочкой респондента.

Моя иерархия была следующей: NSWindow (управляемый NSWindowController) -> contentView -> childview (управляемый NSViewController)

Я обнаружил, что цепочка респондента закончилась в контроллере окна. Таким образом, панель шрифтов не смогла отправить сообщение changeFont: в контроллер представления, где я его реализовал.

Добавив эту строку кода в оконный контроллер, я мог бы решить проблему:

self.nextResponder = self.theViewCtrl;

Однако я до сих пор не понимаю, почему это не работает, когда я вручную настраиваю цель / действие. В любом случае, это работает для меня сейчас.

Другие вопросы по тегам