【问题标题】:Using NSFontPanel in Cocoa在 Cocoa 中使用 NSFontPanel
【发布时间】:2009-09-12 17:46:49
【问题描述】:

我正在尝试使用 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
}

关于我可能做错了什么有什么想法吗?

【问题讨论】:

标签: objective-c cocoa nsfontpanel


【解决方案1】:

包括这个:

[fontManager setTarget:self];

【讨论】:

    【解决方案2】:

    您在其上定义-changeFont: 的对象必须是响应者链中的第一个响应者或在它之上。您尚未指定定义方法的位置,但我假设它位于不在响应者链中的控制器对象上。

    【讨论】:

    • 视图控制器的视图实际上正在加载到另一个窗口中;添加 changeFont: 到父母的 ViewController 工作。感谢您的帮助。
    【解决方案3】:

    NSFontManager 的委托主要用于过滤它通过-fontManager:willIncludeFont: 提供给字体面板的字体。

    正如 kperryua 所提到的,-changeFont: 被发送到响应者链上。启动字体菜单或其封闭视图的按钮可能是为-changeFont: 放置响应者的好地方。

    您可能会发现Font Handling 指南比Font Panel 指南更有用。

    【讨论】:

    【解决方案4】:

    核心问题是这一行:

    [fontPanel makeKeyAndOrderFront:sender];
    

    通过使字体面板成为关键窗口,它不知道将操作消息发送到哪里,例如 -changeFont: to。

    【讨论】:

    • 我改成 orderFrontFontPanel:;但问题实际上出在响应者链上。谢谢。
    【解决方案5】:

    这是我的工作实现。关键是你应该让你的对象成为你实现- (void)changeFont:(id)sender的第一响应者

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

    简单的changeFont:实现参考-Font Handling

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2011-04-12
      • 1970-01-01
      • 2014-01-05
      相关资源
      最近更新 更多