いくつかの試行錯誤の末、私はこれを理解して妥当な回避策を見つけることができたと思います。私は、同じ問題に直面している他の人たちのために、ここですぐに答えを出す予定です。
これは、ココアのデザイン上の欠陥の1つです。 NSToolbarには、NSToolbarShowFontsItemとNSToolbarShowColorsItemのターゲット/アクションをNSApplicationに設定するためのハードコーディングされた動作があり、ドキュメンテーションのヒントとしてNSToolbarItemアイテムに対してvalidateToolbarItem:
を呼び出さないようにします。
これらのツールバー項目を検証する必要がある場合は、デフォルトのフォント/色ツールバー項目を使用するのではなく、独自のロールを使用して同じNSApplicationアクション(下記参照)を呼び出します。
デフォルトのものを使用している場合、あなたのオブジェクトにそれらのターゲット/アクションをリダイレクトし、[今すぐvalidateToolbarItem:
が呼び出されます、元のアクション
- (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:)];
}
}
呼び出すことが可能です:
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
//validate item here
}
をそして、呼び出されるアクションは次のとおりです。
-(IBAction)toolbarOpenFontPanel:(id)sender {
[NSApp orderFrontFontPanel:sender];
}
-(IBAction)toolbarOpenColorPanel:(id)sender {
[NSApp orderFrontColorPanel:sender];
}
I gueこれを設計したエンジニアは、フォント/色のツールバー項目を検証したいとは思っていませんでした。 Go figure。