关于objective C:验证字体和颜色 NSToolbarItem 项

Validating fonts and colors NSToolbarItem items

在 OSX 10.6.6 上使用 Cocoa 和最新的 SDK

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

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

文档对此不是很清楚:

The toolbar automatically takes care
of darkening an image item when it is
clicked and fading it when it is
disabled. All your code has to do is
validate the item. If an image item
has a valid target/action pair, then
the toolbar will call
NSToolbarItemValidation’s
validateToolbarItem: on target if the
target implements it; otherwise the
item is enabled by default.

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

谢谢。


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

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

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

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

1
2
3
4
5
6
7
8
9
10
- (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: 将被调用:

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

下面是将被调用的动作:

1
2
3
4
5
6
7
-(IBAction)toolbarOpenFontPanel:(id)sender {
  [NSApp orderFrontFontPanel:sender];
}

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

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