在OSX 10.6.6上使用Cocoa和最新的SDK
我有一个NSToolbar,其中包含自定义工具栏项以及内置字体和颜色NSToolbarItem项(NSToolbarShowFontsItem和NSToolbarShowColorsItem标识符)。
我需要能够在各种情况下启用/禁用它们。问题是永远不会为这些项调用validateToolbarItem:
(正在为我的其他工具栏项调用它)。
文档对此并不十分清楚:
工具栏会自动完成 当图像项目变暗时变暗 点击它并褪色它 禁用。你的所有代码都要做 验证该项目。如果是图像项目 那么有一个有效的目标/行动对 工具栏会调用 NSToolbarItemValidation的 validateToolbarItem:如果是 target实现它;否则 项目默认启用。
我没有为这两个工具栏项显式设置目标/操作,我想使用它们的默认行为。这是否意味着我无法验证这些项目?或者还有其他方法可以做到这一点吗?
感谢。
答案 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];
}
我想设计这个的工程师从未想过会想要验证字体/颜色工具栏项目。去图。