Показать NSPopover от кнопки NSToolbarItem - PullRequest
9 голосов
/ 16 ноября 2011

Я хочу показать NSPopover с кнопки NSToolbarItem на моей панели инструментов.
(т.е. расположено под кнопкой).

В идеале, я хочу передать NSView кнопки в поповер, чтобы расположить ее.
У меня вопрос, как мне получить NSView из NSToolbarItem?

[toolbarbutton view] всегда возвращает ноль.

Ответы [ 4 ]

6 голосов
/ 19 ноября 2011

Ответ, по-видимому, содержится в видеоролике для сессии 113 WWDC 2011 года "Полноэкранный режим и изменения в Aqua". По сути, поместите NSButton внутри NSToolbaritem и используйте вид этого.

Сообщение в блоге находится здесь: http://www.yellowfield.co.uk/blog/?p=33,, а пример проекта находится на github по адресу http://github.com/tevendale/ToolbarPopover

Все в духе http://xkcd.com/979!

2 голосов
/ 21 января 2013

Вместо того чтобы получать представление от отправителя 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];

Это также будет работать для отображения всплывающих окон из элементов меню на панели инструментов.

2 голосов
/ 24 февраля 2012

Вы можете отправить действие непосредственно из NSButton, заключенного в NSToolbarItem (это то, что вы обычно должны делать в любом случае, рассмотрите сегментированные элементы управления, где каждый сегмент имеет свою собственную цель / действие), и это будет делать трюк.

0 голосов
/ 27 марта 2014

Хотя я добился того, что Popover был показан с использованием подхода, упомянутого Стюартом Тевендейлом, я столкнулся с проблемами, когда попытался проверить (включить / отключить) NSToolbarItems с помощью NSToolbarDelegate:

-(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;
}

Поэтому я бы посоветовал не отображать Popover с NSToolbarItem. Альтернативой может быть отображение страницы листа: Как отобразить панель NSPanel в виде листа

...