Objective c 验证字体和颜色NSToolbarItem项目

Objective c 验证字体和颜色NSToolbarItem项目,objective-c,cocoa,macos,Objective C,Cocoa,Macos,在OSX 10.6.6上使用Cocoa和最新SDK 我有一个带有自定义工具栏项的NSToolbar,还有内置的字体和颜色NSToolbarItem项(NSToolbarShowFontsItem和NSToolbarShowColorsItem标识符) 我需要能够在各种情况下启用/禁用这些功能。问题是,validateToolbarItem:从未为这些项目调用过(为我的其他工具栏项目调用过) 文件对此不是很清楚: 工具栏会自动处理 在图像项处于活动状态时使其变暗的步骤 单击并在单击时使其褪色 残废

在OSX 10.6.6上使用Cocoa和最新SDK

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

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

文件对此不是很清楚:

工具栏会自动处理 在图像项处于活动状态时使其变暗的步骤 单击并在单击时使其褪色 残废你的代码要做的就是 验证项目。如果是图像项 具有有效的目标/操作对,然后 工具栏将调用 NSToolbarItemValidation's validateToolbarItem:如果 目标实施;否则 默认情况下,项目处于启用状态

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


谢谢。

经过一些尝试和错误,我想我能够解决这个问题并找到一个合理的解决办法。我将在这里发布一个快速的答案,供其他面临同样问题的人参考

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

如果您需要验证这些工具栏项,那么不需要使用默认的字体/颜色工具栏项,而是使用自己的工具栏项,调用相同的非应用程序操作(见下文)

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

- (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];
}
我猜设计这个工具的工程师们从来没有想过要验证字体/颜色工具栏项目。算了吧