验证字体和颜色NSToolbarItem项目

时间:2011-02-09 20:35:04

标签: objective-c cocoa macos

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

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

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

文档对此并不十分清楚:

  

工具栏会自动完成   当图像项目变暗时变暗   点击它并褪色它   禁用。你的所有代码都要做   验证该项目。如果是图像项目   那么有一个有效的目标/行动对   工具栏会调用   NSToolbarItemValidation的   validateToolbarItem:如果是   target实现它;否则   项目默认启用。

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

感谢。

1 个答案:

答案 0 :(得分: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];
}

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