Показать NSPopover из кнопки NSToolbarItem

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

В идеале я хочу передать NSView кнопки во всплывающее окно, чтобы позиционировать ее.
Мой вопрос: как мне получить NSView из NSToolbarItem?

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


person Stuart Tevendale    schedule 15.11.2011    source источник


Ответы (4)


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

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

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

person Stuart Tevendale    schedule 19.11.2011

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

person Tony    schedule 24.02.2012
comment
Спасибо - попробую. - person Stuart Tevendale; 04.03.2012

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

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

person Elmer Cat    schedule 21.01.2013

Хотя я добился того, что 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;
}

Так что я бы посоветовал не отображать поповер из NSToolbarItem. Альтернативой может быть отображение листа страницы: Как показать NSPanel как лист

person Besi    schedule 27.03.2014