繁体   English   中英

验证字体和颜色NSToolbarItem项目

[英]Validating fonts and colors NSToolbarItem items

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

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

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

文档不是很清楚:

工具栏会在单击图像项时自动使图像项变暗,在禁用时淡化图像项。 您的所有代码都要验证项目。 如果图像项具有有效的目标/动作对,则工具栏将在目标上调用NSToolbarItemValidation的validateToolbarItem:如果目标实现它; 否则该项目默认启用。

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

谢谢。

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

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

如果您需要验证那些工具栏项,那么无关紧要的事情就是不使用默认的字体/颜色工具栏项,而是使用自己的工具栏,调用相同的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];
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM