經過一些試驗和錯誤,我認爲我能夠弄清楚這一點,找到一個合理的解決方法。我將在這裏發佈一個快速答案,以供將來參考面向同樣問題的其他人蔘考。
這只是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設計這個的工程師從來沒有想過會想要驗證字體/顏色工具欄項目。去搞清楚。