经过一些试验和错误,我认为我能够弄清楚这一点,找到一个合理的解决方法。我将在这里发布一个快速答案,以供将来参考面向同样问题的其他人参考。
这只是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];
}
我gue设计这个的工程师从来没有想过会想要验证字体/颜色工具栏项目。去搞清楚。