【问题标题】:How to add a pop-up menu to a NSToolbarItem?如何向 NSToolbarItem 添加弹出菜单?
【发布时间】:2009-09-30 18:05:08
【问题描述】:

我正在尝试从 NSToolbarItem 打开一个弹出菜单。我尝试遵循this 示例,但我不能使用该类方法,因为 NSToolbar 和 NSToolbarItem 继承自 NSObject 而不是 NSView。

除了创建自定义视图之外,从 NSToolbarItem 打开弹出菜单的最佳方式是什么?

【问题讨论】:

    标签: objective-c cocoa nsmenu nstoolbar


    【解决方案1】:

    基本上,您可以创建类似NSButton 的东西,并附加一个NSMenu,然后使用NSToolbarItemsetView: 方法将按钮嵌入到toolbarItem 中。

    【讨论】:

    • 为什么不将菜单添加到视图,将视图添加到工具栏项?
    • @Rui 不是我建议的吗? ://
    【解决方案2】:

    仅供参考:这篇文章已经结束了,但我只是在浏览,我有一个简单的方法,所以我想我会给出一个答案,以防其他人看到它。我发现我无法从库中将弹出按钮直接拖到 Interface Builder 中的工具栏上。但是,我可以将弹出按钮从窗口拖到工具栏上。所以我首先在窗口上创建弹出按钮,然后将它拖到工具栏上......它可以工作!其他对象也一样。

    【讨论】:

    • 在出现绿色复选标记之前,一切都结束了,有时甚至没有。 ☺ 无论如何,在 3.2.1 中,我无法按照您建议的方式进行操作,因此我将编辑我的答案以包含我的操作方式。
    • 在 3.2.1 中,我可以将弹出按钮直接从库中拖到工具栏上。但是,我仍然可以将一个从窗口拖到工具栏。为此,请确保工具栏未打开,如果工具栏已打开,请单击“完成”按钮。然后将弹出按钮从窗口拖到工具栏上并悬停片刻......工具栏将打开,您可以在其中释放工具栏中的按钮。我认为这种方法更简单,因为在窗口上配置按钮似乎比在工具栏菜单中更容易。
    • regulus6633:哦,你的意思是把它拖到配置工具栏工作表中!我什至不知道可以在 IB 中提出这个问题(“什么‘完成’按钮?”)。现在我已经打开了该工作表,我可以将控件直接从库中拖到其中。你是对的,这很多更容易。
    【解决方案3】:

    只需在 IB 中使用您想要的菜单创建一个 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]];
    }
    

    【讨论】:

      【解决方案4】:

      如果您想要工具栏项的实际弹出按钮,请将 NSPopUpButton 设置为工具栏项的视图。

      在Interface Builder 3.2.1中(我不知道这个能力是什么时候真正引入的),你可以在nib窗口中向下钻取到对象分层列表中的工具栏,并从将库调色板放入列表中的工具栏。 IB 将为您将按钮包装在工具栏项中。

      【讨论】:

        【解决方案5】:

        假设menuNSMenu 对象,senderNSToolbarItem,那么您只需传入sender.view 即可显示菜单。如果您已经通过 Interface Builder 设置了NSToolbarItem,则无需添加其他视图。

        [NSMenu popUpContextMenu:menu
                       withEvent:[NSApp currentEvent]
                         forView:sender.view];
        

        【讨论】:

          猜你喜欢
          • 2017-07-30
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          相关资源
          最近更新 更多