我想從我的工具欄中的NSToolbarItem
按鈕顯示NSPopover
。
(即,位於按鈕下方)。從NSToolbarItem按鈕顯示NSPopover
理想情況下,我想將按鈕的NSView
傳遞給彈出窗口來定位它。
我的問題是,我如何獲得NSToolbarItem
的NSView
?
[toolbarbutton view]
總是返回零。
我想從我的工具欄中的NSToolbarItem
按鈕顯示NSPopover
。
(即,位於按鈕下方)。從NSToolbarItem按鈕顯示NSPopover
理想情況下,我想將按鈕的NSView
傳遞給彈出窗口來定位它。
我的問題是,我如何獲得NSToolbarItem
的NSView
?
[toolbarbutton view]
總是返回零。
答案似乎在2011年WWDC會議113「全屏和水色變化」的視頻中。基本上,在NSToolbaritem中放置一個NSButton並使用它的視圖。
博客文章是在這裏:http://www.yellowfield.co.uk/blog/?p=33,和一個示例項目在GitHub上的http://github.com/tevendale/ToolbarPopover
所有的http://xkcd.com/979的精神!
您可以直接從NSToolbarItem
中包含的NSButton
(這是您通常應該做的事情,考慮分段控件,其中每個段都有其自己的目標/操作)直接發送操作,並且這樣做可以實現。
非但沒有從IBAction爲發送方的看法,直接連接一個IBOutlet到工具欄項目上,並用它來獲得相對的觀點:
在你的頭文件:
@property (weak) IBOutlet NSToolbarItem *theToolbarItem;
@property (weak) IBOutlet NSPopover *thePopover;
在您的實現文件,以顯示彈出窗口:
[self.thePopover showRelativeToRect:[[self.theToolbarItem view] bounds] ofView:[self.theToolbarItem view] preferredEdge:NSMinYEdge];
這也適用於從工具欄項目內的菜單項選擇中顯示彈出窗口。
雖然我沒有做到這一點的酥料餅的使用斯圖爾特Tevendale提到的方法顯示,我確實遇到問題時,我嘗試使用NSToolbarDelegate
驗證(啓用/禁用)的NSToolbarItems
:
-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem {
BOOL enable = YES;
NSString *identifier = [toolbarItem itemIdentifier];
// This does never get called because I am using a button inside a custom `NSToolbarItem`
if ([identifier isEqualToString:@"Popover"]) {
return [self someValidationMechanism];
}
// For this the validation works when I am using a standard `NSToolbarItem`
else if ([identifier isEqualToString:@"StandardToolbarItem"]){
return [self someOtherValidationMechanism];
}
return enable;
}
所以我建議不要在NSToolbarItem
中顯示Popover。另一種方法可能是顯示頁碼錶:How to show a NSPanel as a sheet
謝謝 - 我會試試看。 –