2011-02-09 111 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設計這個的工程師從來沒有想過會想要驗證字體/顏色工具欄項目。去搞清楚。