经过反复试验,我想我能够解决这个问题并找到一个合理的解决方法。我将在这里发布一个快速答案,以供其他面临同样问题的人将来参考。
这只是 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];
}
我猜设计这个的工程师从没想过要验证字体/颜色工具栏项。去图吧。