2014-11-20 4 views
2

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

У меня было это нормально работать в другом приложении, и я просто скопировал и вставил код, но по какой-то нечетной причине метод 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]); 
} 

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

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

Заранее благодарен!

+0

Я не делал этого некоторое время, но установка цели/действия в общем диспетчере шрифтов означает, что для всего процесса может быть только один обработчик. Мне это не кажется правильным. – trojanfoe

+0

Спасибо за ваш комментарий. Я добавил этот код, пытаясь исправить проблему. Таким образом, он также не работает, когда он удаляется. – guitarflow

ответ

0

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

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

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

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

self.nextResponder = self.theViewCtrl; 

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

+0

У меня такая же проблема, и я хотел бы попробовать ваше решение. Но мне непонятно, что собой представляет. Кроме того, что, если у меня нет ни окна, ни контроллера? –