2011-02-09 114 views
4

在OSX 10.6.6验证字体和颜色NSToolbarItem项目

使用可可与最新的SDK我有一个NSToolbar与自定义工具栏项目,还内置的字体和颜色NSToolbarItem项目(NSToolbarShowFontsItem和NSToolbarShowColorsItem标识符)。

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

该文档是不是说得很清楚:

工具栏会自动处理 变暗图像的项目时,它是 点击和褪色它时,它是 禁用的。你所有的代码必须做的是 验证项目。如果图像项 有一个有效的目标/动作对,然后 工具栏将调用 NSToolbarItemValidation的 validateToolbarItem:目标如果 目标实现它;否则 项目默认启用。

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

谢谢。

回答

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]; 
} 

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