Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何将标题相同的多个菜单项添加到NSPoupButton(NSMenu)中?_Cocoa_Macos_Nsmenu_Nspopupbutton - Fatal编程技术网

Cocoa 如何将标题相同的多个菜单项添加到NSPoupButton(NSMenu)中?

Cocoa 如何将标题相同的多个菜单项添加到NSPoupButton(NSMenu)中?,cocoa,macos,nsmenu,nspopupbutton,Cocoa,Macos,Nsmenu,Nspopupbutton,正如文档所说,如果两个菜单项的标题相同,则不可能将它们添加到nspoupbutton。我试图将菜单项添加到[弹出按钮菜单],但没有成功。我还试图创建一个新菜单,向其中添加项目,然后使用[popupButton setMenu:newMenu],但没有。菜单总是每个名称只显示一个项目 但我知道这应该是可能的,如果你试图在iTunes中创建一个智能播放列表,你可以从左边的弹出按钮中选择“playlist”,从中间选择“=”,右边的按钮将为iTunes中的每个播放列表保留菜单项,即使它们具有相同的标题

正如文档所说,如果两个菜单项的标题相同,则不可能将它们添加到nspoupbutton。我试图将菜单项添加到[弹出按钮菜单],但没有成功。我还试图创建一个新菜单,向其中添加项目,然后使用[popupButton setMenu:newMenu],但没有。菜单总是每个名称只显示一个项目


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

虽然像addItemWithTitle:和addMenu:这样的NSPoupButton方法不允许重复名称,但绝对有可能有相同标题的项。您只需在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:)];
}

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

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

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

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

要执行绑定,请执行以下操作:

  • 在IB中添加NSArrayController
  • “内容”的NSPoupButton绑定设置到数组控制器,其中“控制器键”“arrangedObjects”
  • “选定索引”的NSPoupButton绑定设置到阵列控制器,其中“控制器键”“选择索引”
  • [可选]选择阵列控制器,并将属性中的类名设置为项目所属的任何类,例如NSString,或者您可以使用默认的NSMutableDictionary并在下面的框中添加键,这样您就可以将项目包装在字典中,并为要在弹出按钮中显示的内容和所需内容添加不同的键有背景。要设置要在弹出按钮中反映的词典键,请再次转到“内容”的弹出按钮绑定,并将“模式键路径”设置为在数组控制器属性中添加的键

  • 我也尝试过这种方法。但结果是一样的。可能是因为我的弹出按钮位于NSPredicateEditorRowTemplate中,并由其谓词编辑器进行后期处理。我想看看这个方法的一些源代码。我在我的一个应用程序中这样做,它确实有效。这就是我得到上面简化的代码的地方。我必须这样做,因为菜单列出了用户命名的预设设置,并且必须允许重复。我从来没有使用过谓词编辑器,所以我在这方面无能为力。很抱歉PS:如果你想看到它工作,只需用一个弹出按钮创建一个新的测试项目并粘贴到代码中。这并不能解决问题。NSPopUpButton的行为与使用NSPopUpButton的addItemWithTitle:title时完全一样:每个唯一的标题都会显示一个项目。这对我刚才完全有效(macOS 10.15+)。不能在同一个NSPopupButton中混合使用NSMenuItems和itemsWithTitle!嘿,布莱恩,怎么了!