【问题标题】:Validating fonts and colors NSToolbarItem items验证字体和颜色 NSToolbarItem 项
【发布时间】:2011-02-09 20:35:03
【问题描述】:

在 OSX 10.6.6 上使用带有最新 SDK 的 Cocoa

我有一个带有自定义工具栏项的 NSToolbar 以及内置的字体和颜色 NSToolbarItem 项(NSToolbarShowFontsItem 和 NSToolbarShowColorsItem 标识符)。

我需要能够在各种情况下启用/禁用它们。问题是 validateToolbarItem: 从未为这些项目调用(它正在为我的其他工具栏项目调用)。

文档对此不是很清楚:

工具栏会自动处理 当图像项变暗时 当它被点击并淡化它 禁用。你的代码所要做的就是 验证项目。如果图像项 有一个有效的目标/动作对,那么 工具栏将调用 NSToolbarItemValidation 的 validateToolbarItem:在目标上,如果 目标实现它;否则 项目默认启用。

我没有为这两个工具栏项明确设置目标/操作,我想使用它们的默认行为。这是否意味着我无法验证这些项目?或者有没有其他方法可以做到这一点?

谢谢。

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    经过反复试验,我想我能够解决这个问题并找到一个合理的解决方法。我将在这里发布一个快速答案,以供其他面临同样问题的人将来参考。

    这只是 Cocoa 的设计缺陷之一。 NSToolbar 具有硬编码的行为,可以将 NSToolbarShowFontsItem 和 NSToolbarShowColorsItem 的目标/操作设置为 NSApplication,因此文档提示它永远不会为这些 NSToolbarItem 项调用 validateToolbarItem:

    如果您需要验证这些工具栏项目,要做的微不足道的事情是不要使用默认字体/颜色工具栏项目,而是滚动您自己的,调用相同的 NSApplication 操作(见下文)。

    如果使用默认的,可以将它们的目标/动作重定向到您的对象,然后调用原始动作

    - (void) toolbarWillAddItem:(NSNotification *)notification {
      NSToolbarItem *addedItem = [[notification userInfo] objectForKey: @"item"];
      if([[addedItem itemIdentifier] isEqual: NSToolbarShowFontsItemIdentifier]) {                
        [addedItem setTarget:self];
        [addedItem setAction:@selector(toolbarOpenFontPanel:)];
      } else if ([[addedItem itemIdentifier] isEqual: NSToolbarShowColorsItemIdentifier]) {
        [addedItem setTarget:self];
        [addedItem setAction:@selector(toolbarOpenColorPanel:)];
      }
    } 
    

    现在将调用validateToolbarItem:

    - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
      //validate item here
    }
    

    以下是将被调用的操作:

    -(IBAction)toolbarOpenFontPanel:(id)sender {
      [NSApp orderFrontFontPanel:sender];
    }
    
    -(IBAction)toolbarOpenColorPanel:(id)sender {
      [NSApp orderFrontColorPanel:sender];
    }
    

    我猜设计这个的工程师从没想过要验证字体/颜色工具栏项。去图吧。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2016-10-04
      相关资源
      最近更新 更多