Cocoa 如何将标题相同的多个菜单项添加到NSPoupButton(NSMenu)中?
正如文档所说,如果两个菜单项的标题相同,则不可能将它们添加到nspoupbutton。我试图将菜单项添加到[弹出按钮菜单],但没有成功。我还试图创建一个新菜单,向其中添加项目,然后使用[popupButton setMenu:newMenu],但没有。菜单总是每个名称只显示一个项目Cocoa 如何将标题相同的多个菜单项添加到NSPoupButton(NSMenu)中?,cocoa,macos,nsmenu,nspopupbutton,Cocoa,Macos,Nsmenu,Nspopupbutton,正如文档所说,如果两个菜单项的标题相同,则不可能将它们添加到nspoupbutton。我试图将菜单项添加到[弹出按钮菜单],但没有成功。我还试图创建一个新菜单,向其中添加项目,然后使用[popupButton setMenu:newMenu],但没有。菜单总是每个名称只显示一个项目 但我知道这应该是可能的,如果你试图在iTunes中创建一个智能播放列表,你可以从左边的弹出按钮中选择“playlist”,从中间选择“=”,右边的按钮将为iTunes中的每个播放列表保留菜单项,即使它们具有相同的标题
但我知道这应该是可能的,如果你试图在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,并将这些项添加到数组控制器中。然后我使用绑定绑定控制器和弹出按钮,现在它显示具有相同标题的项目 要执行绑定,请执行以下操作:
我也尝试过这种方法。但结果是一样的。可能是因为我的弹出按钮位于NSPredicateEditorRowTemplate中,并由其谓词编辑器进行后期处理。我想看看这个方法的一些源代码。我在我的一个应用程序中这样做,它确实有效。这就是我得到上面简化的代码的地方。我必须这样做,因为菜单列出了用户命名的预设设置,并且必须允许重复。我从来没有使用过谓词编辑器,所以我在这方面无能为力。很抱歉PS:如果你想看到它工作,只需用一个弹出按钮创建一个新的测试项目并粘贴到代码中。这并不能解决问题。NSPopUpButton的行为与使用NSPopUpButton的addItemWithTitle:title时完全一样:每个唯一的标题都会显示一个项目。这对我刚才完全有效(macOS 10.15+)。不能在同一个NSPopupButton中混合使用NSMenuItems和itemsWithTitle!嘿,布莱恩,怎么了!