【问题标题】:NSFontPanel changeFont not calledNSFontPanel changeFont 未调用
【发布时间】:2014-11-20 10:04:55
【问题描述】:

我正在尝试在我的 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]);
}

此代码是从模式窗口(首选项窗口)内的视图控制器调用的,并且字体面板可以正常打开。但是,尽管我手动设置了目标和操作,但我没有得到任何更改。

这个问题与响应者链有关吗? 我该如何解决?我是否需要手动将视图控制器添加到响应者链中?我该怎么做?

提前致谢!

【问题讨论】:

  • 我已经有一段时间没有这样做了,但是在共享字体管理器上设置目标/操作意味着整个过程只能有一个处理程序。这对我来说似乎不对。
  • 感谢您的评论。我在尝试解决问题时添加了该代码。因此,当它被删除时它也不起作用。

标签: objective-c cocoa target-action nsfontpanel


【解决方案1】:

回答我自己的问题,以帮助其他在功能中偶然发现此问题的人。 如我所料,这个问题与响应者链有关。

我的层次结构如下:NSWindow(由 NSWindowController 管理)-> contentView -> childview(由 NSViewController 管理)

我发现响应者链在窗口控制器中结束。 因此,字体面板无法将 changeFont: 消息发送到我实现它的视图控制器。

通过在窗口控制器中添加这行代码,我可以解决这个问题:

self.nextResponder = self.theViewCtrl;

我仍然不明白为什么当我手动配置目标/操作时它不起作用。 无论如何,它现在对我有用。

【讨论】:

  • 我有同样的问题,想试试你的解决方案。但我不清楚自我是什么。另外,如果我既没有窗口也没有视图控制器怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多