如何将具有相同标题的多个菜单项添加到NSPopUpButton(NSMenu)?

时间:2010-02-23 16:56:44

标签: cocoa macos nsmenu nspopupbutton

正如文档所说,如果两个菜单项都具有相同的标题,则无法向NSPopUpButton添加两个菜单项。我试图将菜单项添加到[popupButton菜单],但没有运气。我还试图创建一个新菜单,添加项目然后使用[popupButton setMenu:newMenu],但没有。菜单始终只显示每个名称一个项目。

但是我知道应该可以,如果你尝试在iTunes中创建一个智能播放列表,你可以从左侧弹出按钮选择“播放列表”,从中间选择“=”,右边一个将保存菜单项iTunes EVEN中的每个播放列表,如果它们具有相同的标题。那他们怎么做呢?

3 个答案:

答案 0 :(得分:5)

虽然像addItemWithTitle:和addMenu:这样的NSPopUpButton方法不允许重复名称,但绝对可以使项目具有相同的标题。您只需在NSMenuItem本身上设置名称即可。

例如,如果您有一个字符串数组(可能是播放列表名称),您想将它们添加到弹出按钮,并希望确保重复项存在,请执行以下操作:

NSArray* items = [NSArray arrayWithObjects:@"Foo", @"Bar", @"Baz", @"Foo", nil];

for (NSString* item in items)
{
   [popupButton addItemWithTitle:@"blah"];
   [[popupButton lastItem] setTitle:item];
   [[popupButton lastItem] setTarget:self];
   [[popupButton lastItem] setAction:@selector(something:)];
}

答案 1 :(得分:2)

您可以手动创建NSMenuItem并将其直接添加到菜单中,而不是使用addItemWithTitle:。这允许您指定所需的任何标题,并且可以将其插入菜单中的任何位置。

NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:@"foo" action:@selector(something:) keyEquivalent:@""];

[newItem setTarget:self];
[[popupButton menu] addItem:newItem];
[newItem release];

答案 2 :(得分:1)

我遇到了确切的问题,很容易解决。我没有使用 NSPopUpButton 方法(例如 -addItemWithTitle:)来操作按钮项,而是添加了一个 NSArrayController 并将项目添加到数组控制器中。然后我使用绑定绑定控制器和弹出按钮,现在它显示具有相同标题的项目。

进行绑定:

  1. 在IB中添加 NSArrayController
  2. “内容” NSPopUpButton 绑定设置为阵列控制器,其中“控制器键”为“arrangeObjects”
  3. “选定索引” NSPopUpButton 绑定设置为阵列控制器,“控制器键”“selectionIndex”< /强>
  4. [可选]选择阵列控制器并将属性中的类名称设置为您的项目所属的类别,例如 NSString 或者您可以使用默认的 NSMutableDictionary 并在下面的框中添加键,这样您就可以将项目包装在字典中,并为要显示的内容添加不同的键弹出按钮以及您希望在后台拥有的内容。要设置要在弹出按钮中反映的词典的哪个键,请再次转到“内容”的弹出按钮绑定,并将“模态键路径”设置为您在数组控制器属性中添加的密钥。