Как добавить несколько пунктов меню с одинаковым названием в NSPopUpButton (NSMenu)? - PullRequest
4 голосов
/ 23 февраля 2010

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

Но я знаю, что это возможно, если вы попытаетесь создать умный плейлист в iTunes, вы можете выбрать «Плейлист» в левой всплывающей кнопке, «=» в середине, а правый будет содержать пункты меню каждый плейлист в iTunes даже если они имеют одинаковое название. Так как они это делают?

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Хотя методы NSPopUpButton, такие как addItemWithTitle: и addMenu: не разрешают повторяющиеся имена, определенно возможно иметь элементы с одинаковым заголовком. Вам просто нужно установить имя в самом 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:)];
}
2 голосов
/ 25 февраля 2010

Вместо использования addItemWithTitle: вы можете создать NSMenuItem вручную и добавить его непосредственно в меню. Это позволяет вам указать любой заголовок, который вы хотите, а также иметь возможность вставить его в любом месте меню.

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

[newItem setTarget:self];
[[popupButton menu] addItem:newItem];
[newItem release];
1 голос
/ 02 марта 2010

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

Для привязки:

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