После некоторых проб и ошибок, я думаю, я смог понять это и найти разумный обходной путь. Я опубликую быстрый ответ здесь для дальнейшего использования для других, сталкивающихся с той же проблемой.
Это еще один из недостатков дизайна Какао. NSToolbar имеет жестко запрограммированное поведение для установки цели / действия для NSToolbarShowFontsItem и NSToolbarShowColorsItem в NSApplication, так что в документации указывается, что он никогда не вызовет validateToolbarItem:
для этих элементов NSToolbarItem.
Если вам нужно проверить эти элементы панели инструментов, тривиальная задача состоит не в том, чтобы использовать элементы панели шрифтов / цветов по умолчанию, а в том, чтобы прокрутить свои собственные, вызывая те же действия 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];
}
Я думаю, что инженеры, которые разработали это, никогда не думали, что они захотят проверить элементы панели инструментов шрифтов / цветов. Пойди разберись.