我試圖從NSToolbarItem打開一個彈出式菜單。我嘗試了以下this示例,但我不能使用該類方法,因爲NSToolbar和NSToolbarItem從NSObject繼承,而不是從NSView繼承。如何將彈出菜單添加到NSToolbarItem?
除了創建自定義視圖之外,從NSToolbarItem打開彈出式菜單的最佳方式是什麼?
我試圖從NSToolbarItem打開一個彈出式菜單。我嘗試了以下this示例,但我不能使用該類方法,因爲NSToolbar和NSToolbarItem從NSObject繼承,而不是從NSView繼承。如何將彈出菜單添加到NSToolbarItem?
除了創建自定義視圖之外,從NSToolbarItem打開彈出式菜單的最佳方式是什麼?
供參考:這篇文章很長,但我只是瀏覽,我有一個簡單的方法,所以我想我會給一個答案,以防別人看透它。我發現我無法直接從庫中將彈出按鈕拖動到Interface Builder中的工具欄中。不過,我可以從窗口拖動一個彈出式按鈕到工具欄。所以我首先在窗口上創建彈出按鈕,然後將其拖到工具欄...它的工作原理!與其他對象相同。
只需在你的菜單中創建一個NSView,就像你想要的那樣。然後在窗口控制器,添加一些代碼:
// This assumes you have a window property pointing to the window to which you'll
// add the toolbar. It also assumes you've connected the NSView to add to the
// toolbar to a member called toolbarView.
- (NSArray*)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar {
return [NSArray arrayWithObject:@"myToolbarMenu"];
}
- (NSArray*)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar {
return [self toolbarAllowedItemIdentifiers:toolbar];
}
- (NSToolbarItem*)toolbar:(NSToolbar*)toolbar
itemForItemIdentifier:(NSString*)str
willBeInsertedIntoToolbar:(BOOL)flag
{
if ([str isEqualToString:@"myToolbarMenu"] == YES) {
NSToolbarItem* item = [[NSToolbarItem alloc] initWithItemIdentifier:str];
[item setView:toolbarView];
[item setMinSize:[toolbarView frame].size];
[item setMaxSize:[toolbarView frame].size];
return [item autorelease];
}
return nil;
}
- (void)windowDidLoad {
NSToolbar* toolbar = [[NSToolbar alloc] initWithIdentifier:@"myToolbar"];
[toolbar setDelegate:self];
[self.window setToolbar:[toolbar autorelease]];
}
基本上,你創造的東西像一個NSButton
具有附加給它的NSMenu
,然後使用NSToolbarItem
的setView:
方法嵌入在toolbarItem按鈕。
爲什麼不將菜單添加到視圖和工具欄項目的視圖? – ruipacheco 2009-12-17 21:33:18
@Rui是不是我所說的? :/ – 2009-12-17 21:56:37
如果您需要工具欄項目的實際彈出式按鈕,請將NSPopUpButton設置爲工具欄項目的視圖。
在界面生成器3.2.1中(我不知道這個功能是什麼時候被引入的),你可以深入到nib窗口中對象的分層列表中的工具欄,並從中彈出一個彈出按鈕庫調色板放入列表中的工具欄中。 IB會將按鈕包裝在工具欄項目中。
假設menu
是NSMenu
對象,sender
是NSToolbarItem
,那麼所有你需要做的是通過在sender.view
,顯示菜單。如果您已經通過Interface Builder設置了NSToolbarItem
,則無需添加其他視圖。
[NSMenu popUpContextMenu:menu
withEvent:[NSApp currentEvent]
forView:sender.view];
除非出現綠色複選標記,否則沒有任何結果,有時甚至不會。 ☺無論如何,在3.2.1中,我無法按照您的建議進行操作,所以我會編輯我的答案以包含我做到的方式。 – 2010-04-04 05:05:11
在3.2.1中,我可以直接將彈出按鈕拖動到庫中的工具欄上。不過,我仍然可以從窗口拖動一個到工具欄。要做到這一點,確保工具欄沒有打開,只要點擊「完成」按鈕即可。然後將窗口中的彈出按鈕拖動到工具欄上並將鼠標懸停在其上一會兒......工具欄將打開,您可以在工具欄中釋放該按鈕。我認爲這種方法比較容易,因爲在窗口上而不是在工具欄菜單中配置按鈕似乎更容易。 – regulus6633 2010-04-04 12:50:52
regulus6633:哦,你的意思是將它拖到配置工具欄表!我甚至不知道有可能在IB中提出這個問題(「What'Done'按鈕?」)。現在我已經打開了該工作表,我可以直接從庫中將控件拖入其中。你說得對,這很容易。 – 2010-04-05 10:45:02