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;
Однако я до сих пор не понимаю, почему это не работает, когда я вручную настраиваю цель / действие. В любом случае, это работает для меня сейчас.