Как добавить несколько пунктов меню с одинаковым названием в NSPopUpButton(NSMenu)?
-
22-09-2019 - |
Вопрос
Как говорится в документации, невозможно добавить два пункта меню в NSPopUpButton, если они оба имеют одинаковый заголовок.Я пытался добавить пункты меню в [popupButtonmenu], но безуспешно.Я также пытался создать новое меню, добавить в него элементы и затем использовать [popupButton setMenu:newMenu], но нет.Меню всегда отображает только один элемент для каждого имени.
Но я знаю, что это должно быть возможно: если вы попытаетесь создать умный список воспроизведения в iTunes, вы можете выбрать «Список воспроизведения» с помощью левой всплывающей кнопки, «=" посередине, а правая будет содержать пункты меню для каждого списка воспроизведения в iTunes, ДАЖЕ если у них одинаковое название.Так как они это делают?
Решение
У меня была точная проблема, и она была легко решена.Вместо использования НСПопапбуттон такие методы, как –addItemWithTitle: для управления элементами кнопок я добавил НСаррайконтроллер и вместо этого добавил элементы в контроллер массива.Затем я использовал привязки для привязки контроллера и всплывающей кнопки, и теперь он показывает элементы с одинаковыми названиями.
Чтобы сделать привязки:
- Добавить НСаррайконтроллер в ИБ.
- Установить НСПопапбуттон крепления для "Содержание" к контроллеру массива с помощью "Ключ контроллера" существование "упорядоченныеОбъекты"
- Установить НСПопапбуттон крепления для «Выбранный индекс» к контроллеру массива с помощью «Ключ контроллера» существование "индекс выбора"
- [Необязательно] Выберите контроллер массива и установите Имя класса в атрибутах любого класса, к которому относятся ваши предметы, например. НСстринг или вы можете использовать значение по умолчанию НСМутаблеСловарь и добавьте ключи в поле ниже, что, следовательно, позволит вам обернуть ваши элементы в словарь и добавить разные ключи для того, что вы хотите отображать во всплывающей кнопке, и для того, что вы хотите иметь в фоновом режиме.Чтобы указать, какой ключ словаря должен отображаться во всплывающей кнопке, перейдите к привязке всплывающей кнопки для "Содержание" еще раз и установите «Модальный путь к ключу» к ключу, который вы добавили в атрибут контроллера массива.
Другие советы
Хотя методы NSPopUpButton, такие как addItemWithTitle:и добавитьМеню:не допустит дублирования имен, определенно возможно иметь элементы с одинаковым заголовком.Вам просто нужно установить имя в самом 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:)];
}
Вместо использования addItemWithTitle:
, вы можете создать NSMenuItem вручную и добавить его непосредственно в меню.Это позволяет вам указать любой заголовок, а также вставить его в любое место меню.
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:@"foo" action:@selector(something:) keyEquivalent:@""];
[newItem setTarget:self];
[[popupButton menu] addItem:newItem];
[newItem release];