Как добавить несколько пунктов меню с одинаковым названием в NSPopUpButton(NSMenu)?

StackOverflow https://stackoverflow.com/questions/2320059

Вопрос

Как говорится в документации, невозможно добавить два пункта меню в NSPopUpButton, если они оба имеют одинаковый заголовок.Я пытался добавить пункты меню в [popupButtonmenu], но безуспешно.Я также пытался создать новое меню, добавить в него элементы и затем использовать [popupButton setMenu:newMenu], но нет.Меню всегда отображает только один элемент для каждого имени.

Но я знаю, что это должно быть возможно: если вы попытаетесь создать умный список воспроизведения в iTunes, вы можете выбрать «Список воспроизведения» с помощью левой всплывающей кнопки, «=" посередине, а правая будет содержать пункты меню для каждого списка воспроизведения в iTunes, ДАЖЕ если у них одинаковое название.Так как они это делают?

Это было полезно?

Решение

У меня была точная проблема, и она была легко решена.Вместо использования НСПопапбуттон такие методы, как –addItemWithTitle: для управления элементами кнопок я добавил НСаррайконтроллер и вместо этого добавил элементы в контроллер массива.Затем я использовал привязки для привязки контроллера и всплывающей кнопки, и теперь он показывает элементы с одинаковыми названиями.

Чтобы сделать привязки:

  1. Добавить НСаррайконтроллер в ИБ.
  2. Установить НСПопапбуттон крепления для "Содержание" к контроллеру массива с помощью "Ключ контроллера" существование "упорядоченныеОбъекты"
  3. Установить НСПопапбуттон крепления для «Выбранный индекс» к контроллеру массива с помощью «Ключ контроллера» существование "индекс выбора"
  4. [Необязательно] Выберите контроллер массива и установите Имя класса в атрибутах любого класса, к которому относятся ваши предметы, например. НСстринг или вы можете использовать значение по умолчанию НСМутаблеСловарь и добавьте ключи в поле ниже, что, следовательно, позволит вам обернуть ваши элементы в словарь и добавить разные ключи для того, что вы хотите отображать во всплывающей кнопке, и для того, что вы хотите иметь в фоновом режиме.Чтобы указать, какой ключ словаря должен отображаться во всплывающей кнопке, перейдите к привязке всплывающей кнопки для "Содержание" еще раз и установите «Модальный путь к ключу» к ключу, который вы добавили в атрибут контроллера массива.

Другие советы

Хотя методы 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top